新年第七题

这篇博客讨论了一个编程问题,即在一个整数数组中找出仅出现一次的数字。题目要求其他元素出现三次,而目标元素只出现一次。解决方案包括排序数组后逐个检查,以及使用哈希表统计数字频率。作者提到了两种方法,一种是通过排序后的相邻元素比较,另一种是利用哈希表记录每个数字的出现次数。最后,作者分享了自己的实现并对比了与官方解法的速度。
摘要由CSDN通过智能技术生成

137. 只出现一次的数字 II

给你一个整数数组 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;
    }
}

 

 第一次比官方速度快,真不错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值