【剑指offer】之数组中只出现一次的数字

本文介绍了一种使用异或操作解决特定数组问题的方法,该方法能在O(n)的时间复杂度内找到数组中仅出现一次的两个数字。

题目描述:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。(要求时间复杂度为o(n))

分析:

 

 


java代码实现:

 

	private static String FindnumAppearOnce(int []numbers) {
		String result = null;
		int resultofOR = 0;
		int num1 = 0;
		int num2 = 0;
		if(numbers.length < 1 || numbers == null) {
			result = "无效的输入。";
		} else {
			for(int i=0;i<numbers.length;i++)
				resultofOR ^= numbers[i];
			int index = findFirstBitIsOne(resultofOR);
			for(int i=0;i<numbers.length;i++) {
				if(isBitOne(numbers[i],index)) {
					num1 ^= numbers[i];
				} else {
					num2 ^= numbers[i];
				}
			}
			
			result = "出现一次的两个数字为:" + num1 + "," + num2 ;
		}
		
		return result;
		
	}
	
	private static int findFirstBitIsOne(int num) {
		int index = 0;
		while((num&1)==0 && (index <8)) {
			num = num >> 1;
		    index ++ ;
		}
		return index ;
		
	}
	
	private static boolean isBitOne(int num,int index) {
		num = num >> index;
		if((num&1) == 1)
			return true;
		else
			return false;
	}

测试:

 

public static void main(String[] args) {
	int []numbers = {2,4,3,6,3,2,5,5};
		System.out.println(FindnumAppearOnce(numbers));
	}
输出:出现一次的两个数字为:6,4


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值