LeetCode 只出現一次的數字III
給定一個整數陣列 nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。 找出只出現一次的那兩個元素。
示例 :
輸入: [1,2,1,3,2,5]
輸出: [3,5]
注意:
結果輸出的順序並不重要,對於上面的例子, [5, 3] 也是正確答案。
你的演算法應該具有線性時間複雜度。你能否僅使用常數空間複雜度來實現?
請先翻閱 LeetCode 只出現一次的數字
此題就是nums中存在兩個出現一次的元素。
思路分析:
第一步:將所有元素進行異或,得到只出現一次的兩個元素A、B的異或結果。
第二步:根據上一步得到的異或結果,尋找這兩個元素中最低位(32位整型)第一個出現為1的位置
第三步:根據第二步得到的位置,將原陣列中的元素分成兩個部分進行異或。得到的兩個結果即為解。
解釋關於第三步為什麼可以利用第二步的結果進行分類:如果A、B為兩個不同的數,那麼轉換為32位2進位制時,從低位開始尋找,必定會出現有一個為1,且另外一個為0的位。而將A^B的結果中轉換為32位2進位制,最低為1的位就是前面所尋找的位。(因為1異或0等於1)這樣就可以利用這個位的不同,將原陣列分成兩類,繼而轉換成兩個 只出現一次的數字的問題。
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int tempRes = 0;
//將所有元素異或,得到的結果為出現一次的A^B
for (auto num : nums) {
tempRes ^= num;
}
//從後往前找出第一位為1的位置
int diffNum = 1;
while ((tempRes & diffNum) == 0) {
diffNum <<= 1;
}
int resultA = 0, resultB = 0;
//根據元素種類進行分類
for (auto num : nums) {
if (diffNum & num) {
resultA ^= num;
}
else {
resultB ^= num;
}
}
vector<int> result = { resultA, resultB };
return result;
}
};
相關文章
- LeetCode 只出現一次的數字LeetCode
- LeetCode 只出現一次的數字IILeetCode
- LeetCode之只出現一次的數字-SwiftLeetCodeSwift
- LeetCode136 只出現一次的數字LeetCode
- leetcode136. 只出現一次數字LeetCode
- leetcode力扣136.只出現一次的數字LeetCode力扣
- LeetCode每日一題:只出現一次的數字(No.136)LeetCode每日一題
- 136只出現一次的數字
- 只出現一次的數字 II
- Leetcode 137:只出現一次的數字 II(最詳細的解法!!!)LeetCode
- 136. 只出現一次的數字
- 只出現一次的數字--力扣力扣
- LeetCode 136. 只出現一次的數字【c++/java詳細題解】LeetCodeC++Java
- 找出陣列中只出現一次的數字陣列
- 力扣136.只出現一次的數字力扣
- JZ-040-陣列中只出現一次的數字陣列
- LC-出現一次的數字II
- 第一次只出現一次的字元字元
- 在其它數都出現k次的陣列中找到只出現一次的數陣列
- 第一個只出現一次的字元——Java字元Java
- leetcode —— 1004. 最大連續1的個數 IIILeetCode
- 給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。陣列
- 每日一練(23):第一個只出現一次的字元字元
- JZ-034-第一個只出現一次的字元位置字元
- [LintCode/LeetCode] Contains Duplicate IIILeetCodeAI
- leetcode力扣 1004. 最大連續1的個數 IIILeetCode力扣
- [演算法練習及思路-leetcode劍指offer(Java解法)]No50.第一個只出現一次的字元演算法LeetCodeJava字元
- [LeetCode] 248. Strobogrammatic Number IIILeetCode
- [LeetCode] 3163. String Compression IIILeetCode
- LeetCode 299 猜數字遊戲 Java實現LeetCode遊戲Java
- LeetCode 402 移掉K位數字 HERODING的LeetCode之路LeetCode
- [LeetCode]1207. 獨一無二的出現次數LeetCode
- leetcode 123 買賣股票的最佳時機 IIILeetCode
- LeetCode - 1365 - 有多少小於當前數字的數字LeetCode
- (python版)《劍指Offer》JZ34:第一個只出現一次的字元Python字元
- 數字中的1——leetcode233LeetCode
- LeetCode:尋找丟失的數字LeetCode
- Leetcode——437. 路徑總和 IIILeetCode