<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 0136. 只出現一次的數字 ## 題目地址(136. 只出現一次的數字) <https://leetcode-cn.com/problems/single-number/> ## 題目描述 ``` <pre class="calibre18">``` 給定一個非空整數數組,除了某個元素只出現一次以外,其余每個元素均出現兩次。找出那個只出現了一次的元素。 說明: 你的算法應該具有線性時間復雜度。 你可以不使用額外空間來實現嗎? 示例 1: 輸入: [2,2,1] 輸出: 1 示例 2: 輸入: [4,1,2,1,2] 輸出: 4 ``` ``` ## 前置知識 - [位運算](https://github.com/azl397985856/leetcode/blob/master/thinkings/bit.md) ## 公司 - 阿里 - 騰訊 - 百度 - 字節 ## 思路 根據題目描述,由于加上了時間復雜度必須是 O(n),并且空間復雜度為 O(1)的條件,因此不能用排序方法,也不能使用 map 數據結構。 我們可以利用二進制異或的性質來完成,將所有數字異或即得到唯一出現的數字。 ## 關鍵點 1. 異或的性質 兩個數字異或的結果`a^b`是將 a 和 b 的二進制每一位進行運算,得出的數字。 運算的邏輯是 如果同一位的數字相同則為 0,不同則為 1 2. 異或的規律 3. 任何數和本身異或則為`0` 4. 任何數和 0 異或是`本身` 5. 很多人只是記得異或的性質和規律,但是缺乏對其本質的理解,導致很難想到這種解法(我本人也沒想到) 6. bit 運算 ## 代碼 - 語言支持:JS,C,C++,Java,Python JavaScrip Code: ``` <pre class="calibre18">``` <span class="hljs-title">/** * @param {number[]} nums * @return {number} */</span> <span class="hljs-keyword">var</span> singleNumber = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">nums</span>) </span>{ <span class="hljs-keyword">let</span> ret = <span class="hljs-params">0</span>; <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> index = <span class="hljs-params">0</span>; index < nums.length; index++) { <span class="hljs-keyword">const</span> element = nums[index]; ret = ret ^ element; } <span class="hljs-keyword">return</span> ret; }; ``` ``` C Code: ``` <pre class="calibre18">``` <span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">singleNumber</span><span class="hljs-params">(<span class="hljs-keyword">int</span>* nums, <span class="hljs-keyword">int</span> numsSize)</span></span>{ <span class="hljs-keyword">int</span> res=<span class="hljs-params">0</span>; <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i=<span class="hljs-params">0</span>;i<numsSize;i++) { res ^= nums[i]; } <span class="hljs-keyword">return</span> res; } ``` ``` C++ Code: ``` <pre class="calibre18">``` <span class="hljs-keyword">class</span> Solution { <span class="hljs-keyword">public</span>: <span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">singleNumber</span><span class="hljs-params">(<span class="hljs-params">vector</span><<span class="hljs-keyword">int</span>>& nums)</span> </span>{ <span class="hljs-keyword">auto</span> ret = <span class="hljs-params">0</span>; <span class="hljs-keyword">for</span> (<span class="hljs-keyword">auto</span> i : nums) ret ^= i; <span class="hljs-keyword">return</span> ret; } }; <span class="hljs-title">// C++ one-liner</span> <span class="hljs-keyword">class</span> Solution { <span class="hljs-keyword">public</span>: <span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">singleNumber</span><span class="hljs-params">(<span class="hljs-params">vector</span><<span class="hljs-keyword">int</span>>& nums)</span> </span>{ <span class="hljs-keyword">return</span> accumulate(nums.cbegin(), nums.cend(), <span class="hljs-params">0</span>, bit_xor<<span class="hljs-keyword">int</span>>()); } }; ``` ``` Java Code: ``` <pre class="calibre18">``` <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Solution</span> </span>{ <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">singleNumber</span><span class="hljs-params">(<span class="hljs-keyword">int</span>[] nums)</span> </span>{ <span class="hljs-keyword">int</span> res = <span class="hljs-params">0</span>; <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> n:nums) { <span class="hljs-title">// 異或</span> res ^= n; } <span class="hljs-keyword">return</span> res; } } ``` ``` Python Code: ``` <pre class="calibre18">``` <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Solution</span>:</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">singleNumber</span><span class="hljs-params">(self, nums: List[int])</span> -> int:</span> single_number = <span class="hljs-params">0</span> <span class="hljs-keyword">for</span> num <span class="hljs-keyword">in</span> nums: single_number ^= num <span class="hljs-keyword">return</span> single_number ``` ``` **復雜度分析** - 時間復雜度:O(N)O(N)O(N) - 空間復雜度:O(1)O(1)O(1) ## 延伸 有一個 n 個元素的數組,除了兩個數只出現一次外,其余元素都出現兩次,讓你找出這兩個只出現一次的數分別是幾,要求時間復雜度為 O(n) 且再開辟的內存空間固定(與 n 無關)。 和上面一樣,只是這次不是一個數字,而是兩個數字。還是按照上面的思路,我們進行一次全員異或操作, 得到的結果就是那兩個只出現一次的不同的數字的異或結果。 我們剛才講了異或的規律中有一個`任何數和本身異或則為0`, 因此我們的思路是能不能將這兩個不同的數字分成兩組 A 和 B。 分組需要滿足兩個條件. 1. 兩個獨特的的數字分成不同組 2. 相同的數字分成相同組 這樣每一組的數據進行異或即可得到那兩個數字。 問題的關鍵點是我們怎么進行分組呢? 由于異或的性質是,同一位相同則為 0,不同則為 1. 我們將所有數字異或的結果一定不是 0,也就是說至少有一位是 1. 我們隨便取一個, 分組的依據就來了, 就是你取的那一位是 0 分成 1 組,那一位是 1 的分成一組。 這樣肯定能保證`2. 相同的數字分成相同組`, 不同的數字會被分成不同組么。 很明顯當然可以, 因此我們選擇是 1,也就是 說`兩個獨特的的數字`在那一位一定是不同的,因此兩個獨特元素一定會被分成不同組。 Done! 更多題解可以訪問我的LeetCode題解倉庫:<https://github.com/azl397985856/leetcode> 。 目前已經37K star啦。 關注公眾號力扣加加,努力用清晰直白的語言還原解題思路,并且有大量圖解,手把手教你識別套路,高效刷題。 ![](https://img.kancloud.cn/cf/0f/cf0fc0dd21e94b443dd8bca6cc15b34b_900x500.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看