• 【LeetCode-简单】136. 只出现一次的数字(详解)


    题目

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

    说明:

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

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/single-number
     

    方法1:哈希表

    作者:本人

    思路:

    建立一个哈希表,遍历数组,如果哈希表中有这个数组中这个数,那就删除,如果没有那就添加。

    因为题目说了,其余元素都出现两次,所以进过这样的操作,哈希表中只有那一个我们想要的结果了,遍历哈希表,return即可。

    1. class Solution {
    2. public int singleNumber(int[] nums) {
    3. int len = nums.length;
    4. Map map = new HashMap();
    5. for (int i = 0; i < len; i++) {
    6. if (map.containsKey(nums[i])){
    7. map.remove(nums[i]);
    8. }else {
    9. map.put(nums[i],nums[i]);
    10. }
    11. }
    12. List list =new ArrayList<> (map.values()) ;
    13. return list.get(0);
    14. }
    15. }

    效果不好,肯定有更好的方法 

    方法2:排序

    作者:本人

    思路

    先将数组排序,然后让数组的第一个 - 第二个数 + 第三个数 - 第四个数 + 第五个数 ......

    最终返回结果即可

    例如:

            排序后是[ 1, 1, 2, 2, 3] , 1-1+2-2+3 = 3

            排序后是[ 1, 1, 2, 3, 3] , 1-1+2-3+3 = 2

            排序后是[ 1, 2, 2, 3, 3] , 1-2+2-3+3 = 1

    1. class Solution {
    2. public int singleNumber(int[] nums) {
    3. int len = nums.length;
    4. Arrays.sort(nums);
    5. int res = nums[0];
    6. boolean flag = false;
    7. for (int i = 1; i < len; i++) {
    8. if (flag){
    9. res = res + nums[i];
    10. }else {
    11. res = res - nums[i];
    12. }
    13. flag = !flag;
    14. }
    15. return res;
    16. }
    17. }

    没想到这个笨办法的效率尽然高于方法1 

    方法3:亦或(版本答案) 

    作者:力扣官方

    思路

    什么是亦或?

    亦或就是 :  同为0,不同为1,注意,指的是数字对应的二进制的每一位:同为0,不同为1

    例如:4 ^ 1 = 5

    4: 0100

    1: 0001

    亦或完毕:0101 ,也就是 5

    对于这道题,可使用异或运算 ⊕。异或运算有以下三个性质。

    1. class Solution {
    2. public int singleNumber(int[] nums) {
    3. int len = nums.length;
    4. int res = nums[0];
    5. for (int i = 1; i < len; i++) {
    6. res = res ^ nums[i];
    7. }
    8. return res ;
    9. }
    10. }

     

     版本答案

    总结

    记住亦或的性质,尤其是:交换律和结合律

  • 相关阅读:
    PIL库的crop函数(图片裁剪操作)
    JXLS2同一个sheet多个表格循环覆盖下面表格数据问题
    力扣第45题 跳跃游戏II c++ 贪心算法
    不断探索创新 促进中国信息技术发展——南京宏控科技有限公司董事长应富忠
    Angular-02:环境等说明
    了解、熟悉、掌握、精通 浅解
    关于LDPC编译码参数如何选择确定
    k8s-部署Redis-cluster(TLS)
    中级xss绕过【xss Game】
    低代码平台中的“模型驱动”与“表单驱动”有何区别?
  • 原文地址:https://blog.csdn.net/KangYouWei6/article/details/127789768