给你一个整数数组 nums
,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
示例 1:
输入:nums = [2,2,3,2] 输出:3
示例 2:
输入:nums = [0,1,0,1,0,1,99] 输出:99
在之前我们做过一个类似的题目-->力扣的540题,两题的区别在于,之前的题目只有两个重复数字且数字是按照顺序排列的,这题改为了三个数字,且将顺序打乱了,所以这里我们可以先使用排序,将数组按照正序排列而且注意,题目中虽然其他数字都是重复三次,但是唯一数只有一个,因此我们只需判断有重复即可排除,没必要一定要确认重复为三。
因为排序的影响,相邻的三个数字一定是重复数,我采用三个数一组进行循环,判断相邻两个数字的异同。
public static void main(String[] args) {
int[] num=new int[]{2,2,3,2};
System.out.println(singleNumber(num));
}
public static int singleNumber(int[] nums) {
if (nums.length==1)return nums[0];
Arrays.sort(nums);
int k=0;
for (int i=0;i<nums.length-1;i+=3){
if (nums[i]!=nums[i+1]){
k=nums[i];
break;
}
k=nums[nums.length-1];
}
return k;
}
这个是力扣官方的哈希表方法,通过统计数字的重复次数,输出重复次数为1的数字。
class Solution {
public int singleNumber(int[] nums) {
Map<Integer, Integer> freq = new HashMap<Integer, Integer>();
for (int num : nums) {
freq.put(num, freq.getOrDefault(num, 0) + 1);
}
int ans = 0;
for (Map.Entry<Integer, Integer> entry : freq.entrySet()) {
int num = entry.getKey(), occ = entry.getValue();
if (occ == 1) {
ans = num;
break;
}
}
return ans;
}
}
第一次比官方速度快,真不错。