004 Leetcode 137 只出现一次的数字
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
示例 1:
输入:nums = [2,2,3,2] 输出:3
提示:
1 <= nums.length <= 3 * 104 -231 <= nums[i] <= 231 - 1 nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
来源:力扣(LeetCode) 链接:力扣
题解
方法一:依次确定每个二进制位
因为只有一个数字出现一次,其余都出现三次,所以出现三次的数字各进制的和为3的倍数,出现一次的‘1’模3余1。答案中的第i个二进制位就是所有数的第i个二进制位除以3的余数。根据位运算(x>>i)&1求出x的第i个二进制位。
class Solution { public int singleNumber(int[] nums) { int ans = 0; for (int i = 0; i < 32; ++i) { int total = 0; for (int num: nums) { total += ((num >> i) & 1); } if (total % 3 != 0) { ans |= (1 << i); } } return ans; } }
方法二:哈希表
用哈希表映射每个元素出现的次数,最后找只出现一次的元素即可。
class Solution { public int singleNumber(int[] nums) { Map<Integer, Integer> freq = new HashMap<Integer, Integer>(); int ans = 0; //把数组以映射的方式存入哈希表 for(int num:nums){ freq.put(num, freq.getOrDefault(num,0)+1); } //对哈希表每个元素进行操作 for(Map.Entry<Integer, Integer> entry:freq.entrySet()){ int num = entry.getKey(); int occ = entry.getValue(); if(occ == 1){ ans = num; break; } } return ans; } }