乙個整形陣列a[1...n]包含0~n中的n個數,有乙個數丟失。規定不可以通過a[i]獲取對應的整數,可以使用的唯一的操作是fetch(i, j),該函式表示獲得a[i]的第j個bit的值(即二進位制形式中的第j個bit)。假定fetch(i, j)的操作是常數的,如何在o(n)的時間內找出丟失的整數。
思路:從0到n一共n+1個整數,用n0表示這n+1個整數中最低有效位為0的整數個數,用n1表示這n+1個整數中最低有效位為1的整數個數,那麼n0和n1可能有一下兩種關係:n0 = n1 或 n0 = n1 + 1。
如果丟失的數為奇數,則有:n0 = n1 + 1 或 n0 = n1 + 2,即:n0 > n1。如果丟失的數為偶數,則有:n0 = n1 - 1 或 n0 = n1,即:n0 <= n1。所以通過n0和n1的關係就可以確定丟失的整數的最低有效位是0還是1,這樣就可以淘汰一半的整數。然後檢查次低有效位的數字、第三低有效位的數字等等,以此類推就可以得到丟失的數字。
int findmissing(const vector< vector>& v)
if (n1 >= n0)
miss.push_back(0);
} else
miss.push_back(1);
} }int res = 0;
for (int i = 0; i < miss.size(); ++i)
return res;
}
尋找丟失的數 II LintCode
給乙個由 1 n 的整數隨機組成的乙個字串序列,其中丟失了乙個整數,請找到它。注意事項 n 30 樣例 給出 n 20,str 19201234567891011121314151618 丟失的數是 17 返回這個數。思路 回溯法,進行判斷時,構建visited,來存放數字是否出現過,若當前的位置小...
程式設計之美 尋找丟失的數
兩個題目 1 給你n個數,其中有且僅有乙個數出現奇數次,其餘的數都出現偶數次。要求用線性時間常數空間找出出現奇數次的那個數。2 同樣是n個數,其中有且僅有2個數出現奇數次,其餘都出現偶數次。要求用線性時間常數空間找出出現奇數次的兩個數。首先知道這個公式就好辦了,a 0 a,a a 0 第一題 int...
LintCode 570 尋找丟失的數 II
給乙個由 1 n的整數隨機組成的乙個字串序列,其中丟失了乙個整數,請找到它。注意事項 n 30 樣例 給出 n 20,str 19201234567891011121314151618 丟失的數是17,返回這個數。思路 回溯法進行深度優先搜尋,需要注意的幾點 數字的越界檢查,找到的數字的計數 不計數...