問題一:在乙個整數陣列中,除了乙個數之外,其他的數出現的次數都是兩次,求出現一次的數,要求時間複雜度盡可能的小。例如陣列,出現一次的數是1.
從題目的描述可以看出,陣列中只有乙個數字出現了一次,其他的數字都出現兩次,聯想到異或運算的特點:任何乙個數字和自己做異或運算的結果都是0,任何數字和0運算的結果都是本身。根據上述特點,可以考慮從陣列的第乙個元素開始,逐個和後面的元素做異或操作,最後的計算結果就是要找的只出現一次的數。
演算法實現如下:
publicclass
main ;
}public
static
nums)
int result = 0;
for(int i=0;i)
return
result;
}}
由於只需要遍歷一遍陣列就可以找到結果,因此上述演算法的時間複雜度為o(n),其中n為陣列的長度
發散思維:假如要求的陣列裡面有兩個數出現的次數是1,其他出現的次數都是2,如何找出這兩個數呢?
根據上面問題一的思路,我們依然從頭到位對陣列做異或運算,得到的最終結果應該是兩個不同數字做異或運算後的值。因為兩個數字不相同,最終的結果也肯定不是0,切結果對應的二進位制位中至少有乙個為1,我們找到二進位制位中第乙個是1的位置,即為n,然後根據地n為是1還是0把陣列分為兩個子陣列,第乙個子陣列中的每個數的二進位制位的第n位都是1,另外乙個是0,這樣分完後,相同的數字肯定會被分到同乙個子陣列中,並且每個子陣列中只包含乙個只出現一次的數,根據問題一,我們可以很方便的求出兩個只出現一次的數,實現如下:
publicclass
main ;
}public
static
nums)
int result = 0;
for(int i=0;i)
return
result;
}public
nums)
list
result = new arraylist(2);
int index =findfirstbitidone(temp);
int num1 = 0,num2 = 0;
for(int i=0;i)
else
}result.add(num1);
result.add(num2);
return
result;
}private
static
boolean isbitone(int num, int
index)
private
static
int findfirstbitidone(int
temp)
return
index;
}}
陣列中只出現一次的數
首先看看題目要求 陣列 a中,除了某乙個數字 x之外,其他數字都出現了三次,而 x出現了一次。請給出最快的方法找到x。這個題目非常有意思,在本人部落格中有 位操作基礎篇之位操作全面總結 這篇文章介紹了使用位操作的異或來解決 陣列中其他數字出現二次,而x出現一次,找出x。有 這邊文章介紹了分組異或的方...
陣列中只出現一次的數
題目1 乙個陣列中,除了某乙個只出現過一次的數字外,其餘數字均出現過2次,找出這個只出現了一次的數字。思路 分析題幹,發現強調了陣列中數字出現的次數為1和2,則可以想到異或運算,兩個相同的數字異或結果為0,相同的數異或的結果為其本身,且異或運算存在交換律和結合律,即a b a b,b a a b。那...
陣列中只出現一次的數
題目 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。思路 首先 位運算中異或的性質 兩個相同數字異或 0,乙個數和0異或還是它本身。當只有乙個數出現一次時,我們把陣列中所有的數,依次異或運算,最後剩下的就是落單的數,因為成對兒出現的都抵消了。依照這個思路...