只出现一次的数字 | LeetCode刷题笔记

818 阅读2分钟

这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战


相关文章

LeetCode刷题汇总:LeetCode刷题

一、题目描述


只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗

从简单题目开始刷,锻炼自己的思维能力,为面试准备~

二、思路分析


  • 看看题目的示例,我们来理一理这个思路~

  • 示例 1:

    输入: [2,2,1]
    输出: 1
    
  • 示例2:

    输入: [4,1,2,1,2]
    输出: 4
    
  • 唔,hashMap的key是唯一的,没毛病~

  • 我们可以将数组中的所有值放入map中作为key,value理所当然为1。

  • 循环遍历,如果再次出现,我们可以将value+1。

  • 最后返回value为1的即是只出现一次的值!

三、AC 代码


  • hashMap暴力破解法:

    class Solution {
        public int singleNumber(int[] nums) {
            Map<Integer, Integer> map = new HashMap<>();
    ​
            //第一遍遍历,目的是添加值
            for(int i = 0; i < nums.length; i++){
                if(map.containsKey(nums[i])){
                    map.put(nums[i], map.get(nums[i])+1);
                } else{
                    map.put(nums[i], 1);
                }
    ​
            }
    ​
            //第二遍遍历,目的是找到value为1的值
            for(Integer key : map.keySet()){
                if(map.get(key) == 1){
                    return key;
                }
            }
            return 0;
        }
    }
    
    • image.png
    • 这种方式毋庸置疑,很蠢很笨!
    • 但是主要是这个思路,我们可以充分利用Map中的每一个特性来完成这个问题!
  • 快速排序破解:

    class Solution {
        public int singleNumber(int[] nums) {
             //先进行升序排列
            Arrays.sort(nums);
            //枚举nums中的第偶数个数字
            for(int i=0;i+1<nums.length;i+=2) {
                //如果数字和它后一位不相同,说明当前数字只出现了一个
                if(nums[i]!=nums[i+1]) {
                    return nums[i];
                }
            }
            //如果前面所有的数字都出现了两次,说明答案是最后一个数字
            return nums[nums.length-1];
        }
    }
    
    • image-20210821170322466.png
    • 大家还记得前面的题目存在重复元素 | LeetCode刷题笔记
    • 里面就用到了Arrays.sort(nums);
    • 排序完成后证明,如果相等值得话肯定是左右相邻的!
    • 我们只需要判断偶数位即可,因为最少出现一次嘛!
    • 如果前面所有的数字都出现了两次,那么最后以为理所应当为唯一值!

四、总结

  • 解题思路千千万,不管是本办法还好,还是奇思妙想的解法,能解决就是好办法!白猫黑猫能抓老鼠的猫就是好猫!

  • 这里列几个LeetCode的其他大神的解法作为参考!

  • 点击跳转:官方解法

  • 点击跳转:异或算法

    • 异或解法也太牛逼了吧!!!强烈推荐看一看!可以拓展自己的思路!

**路漫漫其修远兮,吾必将上下求索~ **如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah