• LeetCode 136 只出现一次的数字


    题目链接:LeetCode 136 只出现一次的数字

    题目大意:
    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
    不能使用额外的空间。

    题解:
    由于不能使用额外的空间,所以不能通过计数等方法解决。
    于是想到位运算中的异或运算,有以下性质:

    1. 任何数和\(0\)做异或运算,结果仍然是原来的数,即\(a\oplus 0=a\)
    2. 任何数和其自身做异或运算,结果是\(0\),即\(a\oplus a=0\)
    3. 异或运算满足交换律和结合律,即\(a\oplus b\oplus a=b\oplus a\oplus a=b\oplus (a\oplus a)=b\oplus 0=b\)

    假设数组中有\(2m+1\)个数,其中有\(m\)个数各出现两次,一个数出现一次。令\(a_1、a_2、\dots 、a_m\)为出现两次的\(m\)个数,\(a_{m+1}\)为出现一次的数。根据性质\(3\),数组中的全部元素的异或运算结果总是可以写成如下形式:

    \[(a_1 \oplus a_1) \oplus (a_2 \oplus a_2) \oplus \cdots \oplus (a_m \oplus a_m) \oplus a_{m+1} \]

    根据性质\(2\)和性质\(1\),上式可化简和计算得到如下结果:

    \[0 \oplus 0 \oplus \cdots \oplus 0 \oplus a_{m+1}=a_{m+1} \]

    因此,数组中的全部元素的异或运算结果即为数组中只出现一次的数字。

    class Solution {
    public:
        int singleNumber(vector<int>& nums) {
            int ans = 0;
            for (int num : nums) {
                ans ^= num;
            }
            return ans;
        }
    };
    
  • 相关阅读:
    DOM--3 DOM核心和DOM2 HTML(3)
    js-其他
    DOM--3 DOM核心和DOM2 HTML(2)
    DOM--3 DOM核心和DOM2 HTML(1)
    插入视频(youtube)
    DOM--2 创建可重用的对象
    safari的坑
    DOM--1 遵循最佳实践
    mvc-5视图和模版
    mvc-4控制器和状态(2)
  • 原文地址:https://www.cnblogs.com/IzumiSagiri/p/15872840.html
Copyright © 2020-2023  润新知