LeetCode——只出现一次的数字(三种解法)

110 阅读1分钟

「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」。

前言

大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习进步。

以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。

摘要

本文主要介绍LeetCode只出现一次的数字的一些解法和思路。

【题目】

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

   输入: [2,2,1]
   输出: 1

题目链接:leetcode-cn.com/leetbook/re…

这道题比较简单,之所以拿出来是为了让大家了解以下第二种和第三种解法思路,通过位运算和集合特性来解题,希望读者能够举一反三。

【解法一】

【思想】

先排序,使用count记录该元素出现的次数。
count初值为1,比较相邻的元素:
    如果相等就count++,并且跳过下一个元素。
    如果不相等就判断count是否<2,如果小于2,则返回该元素。

【代码】

public static int singleNumber(int[] nums) {
    /*
    解法1:先对数组进行排序,利用count记录每个数出现的次数。
     */
    //先判断如果只有一个元素,则直接返回该元素
    if(nums.length==1){
        return nums[0];
    }
    Arrays.sort(nums);
    int len = nums.length;
    int i=0;
    for (; i < len-1; i++) {
        int count = 1;
        if(nums[i]==nums[i+1]){
            count++;
            i++;

        }
        if(count<2){
            break;
        }
    }
    if(i>=len){
        return -1;
    }
    return nums[i];
}

【解法二】

【思想】

位运算
异或运算规律:a^b^a = a^a^b = b
将所有元素进行异或运算,最后得到的值就是要返回的值。

【代码】

public static int singleNumber2(int[] nums){
    /*
    解法2:异或运算
     */
    int result = 0;
    for (int i = 0; i < nums.length; i++) {
        result ^= nums[i];
    }
    return result;
}

【解法三】

【思想】

使用set集合特性
把每个元素加入set中,如果添加失败,则说明以前添加过,就把该元素从集合中删除,
最后set集合中剩余的那个元素就是需要的元素。

【代码】

public static int singleNumber3(int[] nums){
    /*
    解法3:使用set集合特性
     */
    Set<Integer> hashSet = new HashSet();
    for (int i = 0; i < nums.length; i++) {
        if(!hashSet.add(nums[i])){
            hashSet.remove(nums[i]);
        }
    }
    return (int)hashSet.toArray()[0];

}

小结

以上就是此题的三种解法和思想,希望能对读者有所帮助,如有不正之处,欢迎留言指正。