1.。面試題:找出數(shù)組中只出現(xiàn)一次的2個數(shù)(異或的巧妙應(yīng)用)(出現(xiàn)3次)
題目:一個整型數(shù)組里除了兩個數(shù)字之外社裆,其他的數(shù)字都出現(xiàn)了兩次拙绊。請寫程序找出這兩個只出現(xiàn)一次的數(shù)字。要求時間復(fù)雜度是O(n)泳秀,空間復(fù)雜度是O(1)标沪。
分析:這是一道很新穎的關(guān)于位運算的面試題。
首先我們考慮這個問題的一個簡單版本:一個數(shù)組里除了一個數(shù)字之外嗜傅,其他的數(shù)字都出現(xiàn)了兩次谨娜。請寫程序找出這個只出現(xiàn)一次的數(shù)字。
這個題目的突破口在哪里磺陡?題目為什么要強調(diào)有一個數(shù)字出現(xiàn)一次趴梢,其他的出現(xiàn)兩次?我們想到了異或運算的性質(zhì):任何一個數(shù)字異或它自己都等于0币他。也就是說坞靶,如果我們從頭到尾依次異或數(shù)組中的每一個數(shù)字,那么最終的結(jié)果剛好是那個只出現(xiàn)依次的數(shù)字蝴悉,因為那些出現(xiàn)兩次的數(shù)字全部在異或中抵消掉了彰阴。
有了上面簡單問題的解決方案之后,我們回到原始的問題拍冠。如果能夠把原數(shù)組分為兩個子數(shù)組尿这。在每個子數(shù)組中簇抵,包含一個只出現(xiàn)一次的數(shù)字,而其他數(shù)字都出現(xiàn)兩次射众。如果能夠這樣拆分原數(shù)組碟摆,按照前面的辦法就是分別求出這兩個只出現(xiàn)一次的數(shù)字了。
我們還是從頭到尾依次異或數(shù)組中的每一個數(shù)字叨橱,那么最終得到的結(jié)果就是兩個只出現(xiàn)一次的數(shù)字的異或結(jié)果典蜕。因為其他數(shù)字都出現(xiàn)了兩次,在異或中全部抵消掉了罗洗。
2.愉舔。刪除一個字符串的字符以及刪除一個字符串與另一個字符串中相同字符的問題
用Java寫刪除一個字符串的其中字符可以直接采用String的一個方法replace()即可。
用java寫刪除一個字符串中與另一個字符串中相同字符的代碼的基本思想是:
(1)從鍵盤中分別輸入兩個字符串伙菜,然后用tocharArray()方法把字符串轉(zhuǎn)換為字符數(shù)組轩缤,
(2)然后讓兩個字符數(shù)組遍歷,并設(shè)定一個boolean類型的變量贩绕,默認值為false,
(3)在遍歷的過程中典奉,如果數(shù)組中的兩個字符相等,則把變量設(shè)為true丧叽,
(4)一個分別與另一個字符串中的字符進行比較卫玖,如果返回結(jié)果仍未false
(5)則把這個字符添加到一個空的字符數(shù)組中去,最后輸出者個字符數(shù)組即可踊淳。