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

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

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


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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值