You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hamming距离程序输出正确但顺序反转,求代码排查帮助

Hamming距离程序输出顺序与示例不符的问题

我正在编写一个名为Hamming的Java程序,需求是从命令行读取整数k和比特串s,计算Hamming距离(两个字符串中不同比特的数量),并输出所有与s的Hamming距离为k的比特串。

示例运行结果:

>java Hamming 2 0011
 1111 1001 1010 0101 0110 0000

我的当前代码:

public class Hamming{

public static void main(String[] args) {
    int k = Integer.parseInt(args[0]); // first argument, hamming distance

    String s = args[1]; // second argument, binary string

    // int array of binary bits that make up the binary string
    int[] bitsString = new int[s.length()];

    // genBinaryStrings(length of string, array of bits, iterating value, hamming distance, binary string)  
    genBinaryStrings(s.length(), bitsString, 0, k, s);
}


//Recursive function that prints all binary strings that are 'h' hamming distance from original
 
private static void genBinaryStrings(int numBits, int binString[], int i, int h, String givenBinString) {

    if (i == numBits) { // base case
        // convert array of bits into binary string of bits
        String currResult = "";
        for (int bit : binString) {
            currResult += Integer.toString(bit);
        }
        
        // check the hamming distance between the current result and the original string
        if (h == getHamDistance(currResult, givenBinString)) {
            System.out.print(currResult + " "); // valid hamming distance, print
        }
        return;
    }
    // generate next possible binary strings
    // generate binary string where next value = 0
    binString[i] = 0;
    genBinaryStrings(numBits, binString, i+1, h, givenBinString);

    // generate binary string where next value = 1
    binString[i] = 1;
    genBinaryStrings(numBits, binString, i+1, h, givenBinString);
}



// This method will Compute Hamming Distance between two binary string
private static int getHamDistance(String resultBinString, String givenBinString) {
    int hamDist = 0; // assume distance is 0 initially

    // iterate thru current resulting binary string
    for (int i = 0; i < resultBinString.length(); i++) {
        // check for differing bit values
        if (resultBinString.charAt(i) != givenBinString.charAt(i))
            hamDist++; // binary string is 1 more bit different
    }
    return hamDist; // total distance
}
}

但我的程序运行输出为:

>java Hamming 2 0011
 0000 0101 0110 1001 1010 1111

结果正确但顺序与示例相反,求帮忙排查问题。


问题原因与解决方法

问题出在递归生成二进制串的顺序上:你当前的代码是先设置当前位为0再递归,之后才设置为1递归,这会生成升序的二进制串序列;而示例要求的是降序输出,只需要调换这两步的顺序即可。

修改genBinaryStrings方法中的生成逻辑:

private static void genBinaryStrings(int numBits, int binString[], int i, int h, String givenBinString) {

    if (i == numBits) { // base case
        // convert array of bits into binary string of bits
        String currResult = "";
        for (int bit : binString) {
            currResult += Integer.toString(bit);
        }
        
        // check the hamming distance between the current result and the original string
        if (h == getHamDistance(currResult, givenBinString)) {
            System.out.print(currResult + " "); // valid hamming distance, print
        }
        return;
    }
    // 调换生成顺序:先1后0
    binString[i] = 1;
    genBinaryStrings(numBits, binString, i+1, h, givenBinString);

    binString[i] = 0;
    genBinaryStrings(numBits, binString, i+1, h, givenBinString);
}

修改后,程序会先生成高位为1的二进制串,输出顺序就会和示例完全一致。

内容的提问来源于stack exchange,提问作者Brian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:41:13