工作四年,期间一直大大小小写过个各种小工具
突然有感而发,觉得应该个地方记录下这些点点滴滴,本人还有很多不足,希望能和各位看官大神一起交流切磋,不足的地方也希望可以得到指证。
本题是这样的,在一组数字中(日后可以考虑换成string组,更符合工作需要),其中有一组不同,比如
{1,1,5,5,8,8,9,10,56,56,87,87}
问如何快速找到9与10?
说两组循环查找的就点右上关闭按钮,走好
说用各种现成方法的,也请绕道。
先贴代码。。代码将会有各种优化空间,希望有兴趣的可以帮忙一起改正拉。
public static int Diff(int a, int b[]) {
for (int i =1; i <= b.length - 1;i++) {
a = b[i] ^a;
}
return a;
}
public static void main(String agrs[]) {
int a[] = {1,1,5,5,8,8,9,10,56,56,87,87};
int aa[] = new int[a.length-3];
int bb[] = new int[a.length-3];
/*split the group to 2 arrays which will include the 2 different number separately*/
int position = getHighestPosition (Diff(a[0],a));
aa = DiffWithDigital(a,true,position);
bb = DiffWithDigital(a,false,position);
System.out.print("one is " + Diff(aa[0],aa) + " another one is " + Diff(bb[0],bb) );
}
public static int[] DiffWithDigital(int c[],boolean seq,int position) {
int ar[] = new int[c.length-3];
int count = 0;
if (seq == true) {
for (int i =0; i <= c.length - 1;i++) {
if ((c[i] >> position) % 2 == 0) {
ar[count] = c[i];
count ++;
}
}
} else {
for (int i =0; i <= c.length - 1;i++) {
if ((c[i] >> position) % 2 != 0) {
ar[count] = c[i];
count ++;
}
}
}
return ar;
}
public static int getHighestPosition(int a) {
/* just return the highest position of the decimal,
we can dynamically return the different position of the digital, optimize it when you have time ^_^ */
return a > 64 && a < 128 ? 6 :
a > 32 ? 5 :
a > 16 ? 4 :
a > 8 ? 3 :
a > 4 ? 2 :
a > 2 ? 1:0;
}
首先请大家知道异消法这个神气的东西,这里不做解释。
我们将所有数字转换成2进制后,通过异消得到一个最终数字
比如1^1^5^5^8^8^9^10^56^56^87^87
最后得出的一定是9^10的异消 结果应该是00010
然后我们可以根据1号位(红色加大位置)的不同,将数组分成两组,最终一定可以把9,10分到不同的两个数组中
好了,聪明的客官一定知道我接下去要做什么了
对
把这两组数组分别进一步异消
代码写完了 不难 但是其中有几个可以优化的点,有兴趣的同学可以优化完后发我大家一起讨论讨论
1,现在是两个数 但是在实际场景中可能有3,4,5个数是不成队的,到时怎么办
2,细心的同学可以发现,我在判断最高位有1没1的时候,使用了java的位运算,截取到那一位,通过基偶分组,但是无形中增加了运算复杂度,假设我有一千万条数据,每条都要通过位移来判断最高位,天啊,gg了啊,所以数学好的同学可以教我下有没有更迅速的方法。(下面做解释)
比如现在我通过异消得到在第三位(从0开始)的数字是1,比如8(01000),那我把所有数字全部右移3位,然后通过是基是偶,就能得知该位的此数究竟是1而不是1,从而分组。