題目:645、697
陣列中包含1~n,缺乙個,有乙個數字重複。eg:nums=[1,2,2,4],重複的數字為2,缺少的數字為3。要注意陣列是無序的
①將陣列中數字出現的次數存在map中,次數為0即為缺少的數;次數為2,為重複的數。
②學到的一種新思路,使用異或。個人理解,相同的數字異或結果為0,所以把題目陣列nums的所有數與原本的1~n異或,相同的為0,剩下的就只有重複的數字和缺少的數字的異或結果,用xor表示。接下來需要考慮的就是怎麼把這兩個數分開。以2^4為例,結果為110(二進位制形式)。用rightmost表示最右邊的那個1,即110(加粗部分),此位為1,說明以二進位制表示這兩個數,他們這位是不相等的。因此可以把nums分成兩類:一種是這位為1的xor1,一種是這個位置為0的xor0。要求的兩個數分別在這兩種之中。怎麼從這兩類中得到要求的數呢,方法和上面類似,就是把1–n也分成這兩類,再次異或,即為所求。只需對nums中是否有此結果進行判斷,就可以把重複和缺少的數分開。
需要考慮的是怎樣實現提取出xor最右邊的1,方法是xor&(-xor),原理是負數用補碼表示,是原碼的反碼加一,考慮原碼最右邊的那個1,則再往右都為0,反碼為1,補碼再加1,進製,直到與原碼為1位置對應的0變為1,剩下的其餘各位均為0。
class solution
for(
int i=
0;i)return res;}}
;
class solution
return res;}}
;
題目給了度的定義:陣列裡元素出現最多的次數。尋找nums中與nums度數相同的最短子列。返回長度。
eg:輸入:[1, 2, 2, 3, 1]
輸出:2
解釋:輸入陣列的度是2,因為元素1和2的出現頻數最大,均為2.
連續子陣列裡面擁有相同度的有如下所示:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
最短連續子陣列[2, 2]的長度為2,所以返回2。
可以分兩步解決:①求出度數;②尋找最小子列。以[1,2,2,3,1]為例,出現次數最多為1和2,最短子列為[2,2],可以發現最短子列必包含出現次數最多的數,且其為最短子列的首尾元素。因此可以使用map儲存元素出現次數和第一次出現的位置,最後一次出現的位置。子列長度即為最後位置-最初位置+1。需要注意的是,最高頻的元素可能不唯一,例如[1,2,2,3,1],因此需要比較得出最短子列長度。
class solution
int minl=int_max;
for(
auto
& k:count)
return minl;}}
;
Leetcode Day 2 移除元素
給你乙個陣列 nums 和乙個值 val,你需要 原地 移除所有數值等於 val 的元素,並返回移除後陣列的新長度。不要使用額外的陣列空間,你必須僅使用 o 1 額外空間並 原地 修改輸入陣列。元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素。示例 1 給定 nums 3,2,2,3 va...
leetcode day2 有效的括號
題目 給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。思路 考慮如下情況 空集和奇數個數 如果不是按順序出現的,派出,例如,右括號先出現的派出 a中的元素和b中的最後乙個元素一樣,那麼就pop掉。c...
每天學習一點點 LeetCode day2
今天的題目是最長回文子串,自己考慮的方法就是暴力法啦,對短一點的輸入還好說,過長的字串自然就超時,雖然我本地能跑出來。暴力法思路 遍歷字串得到所有子串 用的迴圈 然後對每個字串判斷是否滿足回文的條件 還是迴圈 對於回文子串還得取最長的。以下是 class solution string ss str...