数组中只出现一次的元素(异或 or Hash)+ 消失的数字

练习题 专栏收录该内容
38 篇文章 1 订阅

【案例一】其余元素出现过两次——使用异或

  • 异或:两个相同数的异或结果为0(其二进制会进行异或);
  • 异或满足交换律和结合律。
    eg:[2,3,2]交换律
    三个数异或:010 ^ 011^010 = 010 ^ 010 ^ 011 = 0 ^ 011 = 011——得出3

【面试题】给定一个非空整数数组,其中只有一个元素出现一次,其他元素均出现两次,找出那个只出现一次的元素

public class Main{
    public static void main(String[] args){
        int[] arr = {2,2,5,4,1,1,5,7,7};
		int once = 0;
		for(int i=0;i<arr.length;i++){
			once = once ^ arr[i];
		}
		System.out.println(once);
    }
}

——得出结果为:4

【案例二】其余元素出现过多次

如果是其它数字出现多次,就一个数字出现一次,找出该数字,则可以用HashMap来做:

import java.util.*;

public class Main1{
    public static void main(String[] args){
        int[] arr = {2,2,5,4,1,1,5,7,5,7};
		Map<Integer,Integer> map = new HashMap<>();
		//数组元素为key,出现次数为value
		for(int i=0;i<arr.length;i++){
			if(map.get(arr[i]) == null){
				map.put(arr[i],1);
			}else if(map.get(arr[i]) == 1){
			//该数组元素已经出现过,则再次加入,使得value为2
				map.put(arr[i],2);
			}
		}
		int res = 0;
		for(Map.Entry<Integer,Integer> num : map.entrySet()){
			if(num.getValue() == 1){
				res = num.getKey();
			}
		}
		System.out.println(res);
    }
}

【案例三】消失的数字

数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
示例1:

输入:[9,6,4,2,3,5,7,0,1]
输出:8

class Solution {
    public int missingNumber(int[] nums) {
        int res = 0;
        for(int i=0;i<nums.length;i++){
            res = res ^ i;
            res = res ^ nums[i];
        }
        res = res ^ nums.length;
        return res;
    }
}
  • 0
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值