2021.4.21算法题

  • 问题: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
    说明:
  • 要求:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
  • 示例 1:
    输入: [2,2,1]
    输出: 1
    示例 2:
    输入: [4,1,2,1,2]
    输出: 4
  • java解答:
    Java hashMap相关
@Test
public void test01(){
int[] arr1 = {1,2,3,2,3};
   aa = null;
Map<Integer,Integer> map = new HashMap<>();
//通过hashMap的key存储数组的值,value存储该字出现的次数
 for(int i = 0; i< arr1.length;i++){	
		if(map.get(arr1[i]) == null){
		map.put(arr1[i],1);
		}else if(map.get(arr1[i]) == 1){
		map.put(arr1[i],2);
		}
}
for(Map.Entry<Integer,Integer>str : map.entrySet() ){
if(str.getValue() == 1){
  aa = str.getKey();
}
}
System.out.println(aa);
}
位运算解决

异或运算法则:
  1. a ^ b = b ^ a
  2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
  3. d = a ^ b ^ c 可以推出 a = d ^ b ^ c.
  4. a ^ b ^ a = b.
  运算有交换率特性

	@Test
	public void test02(){
	//相同的数字异或为0,和0的异或是自己本身;
		int[] aa = {1,2,2,3,3};
		int result = 0;
		for(int i = 0; i < aa.length;i++){
		aa = 0^aa[i];
			}
		System.out.println(aa);
}

如果不好理解的话可以运行下面的代码:

 System.out.println(4^1^2^1^2);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值