迅速找出成对数组中的一组不同------工地里吃萝卜的天马座

来源:互联网 发布:python time sleep参数 编辑:程序博客网 时间:2024/06/08 02:58

工作四年,期间一直大大小小写过个各种小工具

突然有感而发,觉得应该个地方记录下这些点点滴滴,本人还有很多不足,希望能和各位看官大神一起交流切磋,不足的地方也希望可以得到指证。


本题是这样的,在一组数字中(日后可以考虑换成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,从而分组。




0 0