問題描述:
乙個很大的列表(有10億多個數),這個列表中全是都是id號,正常狀態下每個id都會再列表中出現兩次(都是亂序)
1. 當有乙個id號丟失時,如何找到這個id號;
2. 當有兩個id號丟失時,如何找到這兩個id號。
解法一(最直觀)
申請乙個陣列,這個陣列和id列表一樣大,然後遍歷id列表,每遍歷乙個id號就在陣列[id]加1,最後遍歷陣列,找到數目為1的元素,該元素的索引就是id號。該方法很直觀,而且時間複雜度也不錯,o(n),但是空間複雜度也是o(n),所以有改進的地方。
解法二(本質還是解法一)
解法一中用的陣列去進行記錄的,解法二就是用雜湊鍊錶。同樣是遍歷id列表,當發現雜湊表中沒有這個id號的時候就新增進去,如果發現有這個id號就就在雜湊表中將這個id刪除。最好在理想情況下,時間複雜度是o(n),但是空間複雜度為o(1)。
其實我個人感覺解法二還是蠻完美的,但是有以下幾個問題:
1. 當存在兩個相同的id號丟失時,不能找出;
由於id列表過大,當不同的id號都集中在列表的前半部分的時候,也許也會存在溢位等問題。
解法三書中提出的解法三和解法四,但是我感覺這兩個方法可以結合一下。
對於只有乙個id丟失的情況下,對所有的id號依次異或,最後得到的結果一定為該丟失的id號,還是比較有技巧的這個方法,但是這個方法不能處理有兩個id號丟失的情況:
1. 當有兩個id號丟失,且兩個id號相同,那麼最後的結果一定0;
2. 當有兩個id號丟失x和y,且兩個id號不同,那麼最後只能得到x^y。
對於第一種情況:
可以結合書中解法四,事先儲存所有id的總和和,然後減去列表中所有id的總和,最後在除以2就可以得到丟失的兩個一樣的id號。
對於第二種情況:
全部異或得到的是
x^y = a
事先儲存所有id的總和和,然後減去列表中所有id的總和得到的是
x+y = b
我自己推到了一下,根據上面兩個公式不能得到x和y的值(注意複習平均數公式(x+y)/2=x&y+((x^y)>>1))也只能根據書中分類方法進行查詢。即建立第二個方程。將所有的id號相乘除以目前表中id的乘積得到x*y,結合第一種情況得到的x+y解出x和y,但是存在溢位問題。所以如果大家有更好的方法希望可以幫助我。
重新開始戰鬥10 程式設計之美 尋找發帖水王
n問題描述 給定乙個論壇所有帖子的列表,其中帖子作者的id也在列表中,水王的發帖數目超過了所有帖子的半,請設計演算法,找出水王!問題分析 該問題很直接,簡化一下,就是找乙個陣列中,出現次數最多的數,其中,這個出現次數最多的數的出現次數佔整個陣列大小 50 最直觀的方法是對陣列進行排序,然後遍歷,即可...
重新開始戰鬥03 程式設計之美 買書問題
問題描述 由於 哈利波特 系列相當暢銷,店長決定通過 活動來回饋讀者。上櫃的 哈利波特 瓶裝本系列中,一共有5卷。假設每一捲單獨銷售均需8歐元。如果讀者一次購買不同的兩卷,就可以扣除5 的費用,三卷更多。具體的折扣如下 本數 折扣 2 5 3 10 4 20 5 25 每本書只能享受一種折扣。例如買...
重新開始戰鬥05 程式設計之美 光影切割
問題描述 假設有乙個矩形區域,有若干條直線切割該區域,並且沒有一條直線與y軸平行,且不存在三條 以及3條以上 切割線相交於一點的情況。請問該矩形平面被分割成多少塊。分析 假設一塊矩形區域已經被切割成很多塊,那麼此時再增加一條切割線,新的切割線與其他切割線相交,且有m個交點。那麼新的切割線被分割成m ...