查找多个位集的公共父级java
我无法在位集方法中找到这个简单问题的正确解决方案。问题是从最左边的位开始查找位集的公共父级。以下是一些例子:查找多个位集的公共父级java,java,algorithm,bitset,Java,Algorithm,Bitset,我无法在位集方法中找到这个简单问题的正确解决方案。问题是从最左边的位开始查找位集的公共父级。以下是一些例子: 011 010 001 Common Parent: 0 00 010 Common Parent: 0 00 11 10 Common Parent: None 1101 111 1100 Common Parent: 11 我的解决方案是对和位集进行排序,然后通过查找这些位集的XOR上的第一个集位来找到正确的长度。它在某些情况下有效,但在其他情况下失败。我有另一个想法,涉及
011
010
001
Common Parent: 0
00
010
Common Parent: 0
00
11
10
Common Parent: None
1101
111
1100
Common Parent: 11
我的解决方案是对和位集进行排序,然后通过查找这些位集的XOR上的第一个集位来找到正确的长度。它在某些情况下有效,但在其他情况下失败。我有另一个想法,涉及到位集上的循环,如果你有解决方案,我很乐意避免
[我知道它们可以表示为二叉树,但这涉及内存开销,我希望通过仅对位集和一些布尔运算(and、OR、NOR、NAND、XOR)进行操作来避免这一开销]例如,您可以这样做:
String[] input = {"011","010","001"};
if(input.length==0) return ;
int n=input[0].length();
List<BitSet> bitsets = new ArrayList<>();
for(String in:input){
// n is the min length of the inputs
n=Math.min(n,in.length());
// If you start counting the indices from the left, you need to reverse the inputs
String reverse = new StringBuilder(in).reverse().toString();
// Create the actual bitsets
BitSet b = BitSet.valueOf(new long[] { Long.parseLong(reverse, 2) });
bitsets.add(b);
}
for(int i=0;i<n;i++){
boolean equals=true;
for(int j=1;j<bitsets.size();j++)
equals &= bitsets.get(j-1).get(i)==bitsets.get(j).get(i);
if(equals)
System.out.print(bitsets.get(0).get(i)?"1":"0");
// You can also print the indices if needed.
}
String[]输入={“011”、“010”、“001”};
if(input.length==0)返回;
int n=输入[0]。长度();
列表位集=新的ArrayList();
for(字符串输入:输入){
//n是输入的最小长度
n=Math.min(n,in.length());
//如果从左侧开始计算索引,则需要反转输入
字符串反向=新的StringBuilder(in).reverse().toString();
//创建实际的位集
bitsetb=BitSet.valueOf(new long[]{long.parseLong(反向,2)});
位集。添加(b);
}
对于(int i=0;i您可以和和或所有位集并存储在两个变量中。从MSB
到LSB
同时迭代这两个变量。如果或[i]
为0
,则所有位集在第i个位置都有0
。如果和[i]
是1
,所有位集在该位置都有1
,否则它们是混合的。我建议反转数字并从右侧查找父项,然后反转父项以查找真实的内容
我认为你遇到的最棘手的情况是
1101
111
1100
Common Parent: 11
倒车可以让你摆脱困境