剑指offer_数组中只出现一次的数字

题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次,找出这两个数

方法一:直接用map存储出现次数

 1 //num1,num2分别为长度为1的数组。传出参数
 2 //将num1[0],num2[0]设置为返回结果
 3 import java.util.*;
 4 public class Solution {
 5     public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
 6         HashMap<Integer,Integer> map = new HashMap<>();
 7         for(int num : array){
 8             if(map.containsKey(num)){
 9                 map.put(num,map.get(num)+1);
10             }else{
11                 map.put(num,0);
12             }
13         }
14         int cnt = 0;
15         for(int num :array){
16             if(map.get(num)==0&&0==cnt) {num1[0]=num;cnt++;}
17             if(map.get(num)==0&&0!=cnt) num2[0]=num;
18         }
19     }
20 }

方法二

两个不相等的元素在位级表示上必定会有一位存在不同,将数组的所有元素异或得到的结果为不存在重复的两个元素 异或的结果。

diff &= -diff 得到出 diff 最右侧不为 0 的位,也就是不存在重复的两个元素在位级表示上最右侧不同的那一位,利用 这一位就可以将两个元素区分开来。

 1 public void FindNumsAppearOnce(int[] nums, int num1[], int num2[]) {
 2 int diff = 0;
 3 for (int num : nums)
 4   diff ^= num;
 5 diff &= -diff;
 6 for (int num : nums) {
 7   if ((num & diff) == 0)
 8   num1[0] ^= num;
 9 else
10   num2[0] ^= num;
11 }
12 }

 

posted @ 2019-09-12 10:15  chyblogs  阅读(152)  评论(0)    收藏  举报