日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode--260. 只出现一次的数字Ⅲ

發布時間:2024/7/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode--260. 只出现一次的数字Ⅲ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給定一個整數數組?nums,其中恰好有兩個元素只出現一次,其余所有元素均出現兩次。 找出只出現一次的那兩個元素。

示例 :

輸入: [1,2,1,3,2,5]
輸出: [3,5]
注意:

結果輸出的順序并不重要,對于上面的例子,?[5, 3]?也是正確答案。
你的算法應該具有線性時間復雜度。你能否僅使用常數空間復雜度來實現?

思路:

1.對所有數字異或,一樣的數字抵消,出現一次的兩個數字異或運算后必定不為0;

a^0=a, a^a=0,所以對整個數組進行異或運算剩下的應該是只出現了一次的兩個數的異或結果a


2.這個數字和相反數做與運算得到一個二進制位最右邊一位為1的數字;

兩個不同的數,其異或結果于二進制的表達上,任意一個值為一的比特位便表示了兩個數的不同(如果a、b兩個值不相同,則異或結果為1。如果a、b兩個值相同,異或結果為0)。

所以我們找到a最低位為1的值,這是他們兩個數不同的地方? ?

?a &=(~a)+1;可以完成這個操作

?

3.a和數組的每個數字做與運算,等于0的分為一組,等于a的分為一組,同時也將兩個不一樣的數字分開;

兩個數分在了不同的組,之后分別異或,各組中除了他倆,其他的都出現了兩次,所以各組最后的異或結果就是他倆的值


4.完成。

class Solution {
? ? public int[] singleNumber(int[] nums) {
? ? ? ? int n = nums.length;
? ? ? ? int a=0,i;
? ? ? ? for(i=0;i<n;i++)
? ? ? ? {
? ? ? ? ? ? a = (a^nums[i]);
? ? ? ? }
? ? ? ? a &=(~a)+1;
? ? ? ? int[] b = new int[2];
? ? ? ? for(i=0;i<n;i++)
? ? ? ? {
? ? ? ? ? ? if((a&nums[i])==0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? b[0] = (b[0]^nums[i]);
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? b[1] = (b[1]^nums[i]);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return b;
? ? }
}

總結

以上是生活随笔為你收集整理的Leetcode--260. 只出现一次的数字Ⅲ的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。