一个数组,有一个数出现3次,其余出现2次,求出现3次的数,要求时间复杂度<nlogn,空间复杂度O(1)

数组问题,其中大部分元素出现三次,但有一个元素仅出现一次。讨论了如何以线性时间和常数空间复杂度找到这个唯一出现一次的数字。
摘要由CSDN通过智能技术生成
/**
 * 一个数组,有一个数出现3次,其余出现2次,求出现3次的数,要求时间复杂度<nlogn,空间复杂度O(1)
 * @author Administrator
 *
 */
public class FindSpecialNumInArray {

	/**
	 * 一个数与自身异或结果为0;0与任何数异或结果不变;由此可知,出现两次的数异或后结果为0,出现3次的数,
	 * 异或后结果为该数,因此将数组所有的数进行异或,最后剩下的数就是出现3次的数,时间复杂度为o(n),
	 * 空间复杂度为O(1);此方法可以再出现偶数个数与奇数个数数组中找到出现奇数个的数;
	 * @param arr[]
	 * @return
	 */
	public int findSpecialNum(int[] arr){
		int temp = 0;
		for(int i=0;i<arr.length;i++){
			temp ^= arr[i];
		}
		return temp;
	}
}
@Test
 public void findSpecialNumInArray(){
  int[] arr = {15,56,89,25,71,83,99,22,55,15,56,89,25,99,71,83,22,55,55};
  FindSpecialNumInArray fsna = new FindSpecialNumInArray();
  System.out.println(fsna.findSpecialNum(arr));
 }

类似的题目:在一个数组中除两个数字只出现1次外,其它数字都出现了2次,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值