我正在尝试获取整数数组的链表,表示长度为 N 的位串的可能排列,例如 N = 2
00 01 10 11
我成功地编写了将位表示为字符串的代码,如下所示:
public static LinkedList<String> printBin(String soFar, int iterations) {
if(iterations == 0) {
LinkedList<String> ret = new LinkedList<String>();
ret.add(soFar);
return ret;
}else {
LinkedList<String> ret = new LinkedList<String>();
ret.addAll(printBin(soFar + "0", iterations - 1));
ret.addAll(printBin(soFar + "1", iterations - 1));
return ret;
}
}
但是我尝试将此代码转换为使用整数数组,结果 N = 2 我得到
11 11 11 11
以下 SSCE:
public class Main {
public static void main(String[] args){
int numberOfBits = 2;
LinkedList<int []> results = printBin(new int[numberOfBits], 0, numberOfBits);
Iterator<int[]> i = results.iterator();
while(i.hasNext()){
int[] temp = i.next();
for(int j = 0; j < temp.length; j++){
System.out.print(temp[j]);
}
System.out.println("");
}
}
public static LinkedList<int[]> printBin(int[] soFar, int counter, int iterations) {
if(iterations == 0) {
LinkedList<int[]> ret = new LinkedList<int[]>();
ret.add(soFar);
return ret;
}else {
LinkedList<int[]> ret = new LinkedList<int[]>();
int[] soFar1 = soFar; soFar1[counter] = 0;
int[] soFar2 = soFar; soFar2[counter] = 1;
ret.addAll(printBin(soFar1, counter + 1, iterations - 1));
ret.addAll(printBin(soFar2, counter + 1, iterations - 1));
return ret;
}
}
如有任何帮助,我们将不胜感激。
最佳答案
您的代码的问题是它一直重复使用数组的相同实例 soFar
在每个调用级别上,而不是制作副本。如果将代码更改为
int[] soFar1 = (int[])soFar.clone(); soFar1[counter] = 0;
int[] soFar2 = (int[])soFar.clone(); soFar2[counter] = 1;
您的代码应该产生您想要的结果 ( demo on ideone )。
但是,您最好迭代所有来自 0
的整数至 (1 << numberOfBits) - 1
,并打印它们的二进制表示:
LinkedList<int[]> ret = new LinkedList<int[]>();
int endMask = 1 << numberOfBits;
for (int mask = 0 ; mask != endMask ; mask++) {
int[] combo = new int[numberOfBits];
for (int i = 0 ; i != numberOfBits ; i++) {
combo[i] = ((mask & (1 << i)) != 0) ? 1 : 0;
}
ret.add(combo);
}
关于java - 在 Java 中使用递归打印长度为 N 的位串的排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16816799/