LeetCode Day2 統計陣列中的元素

2021-10-20 22:16:48 字數 1412 閱讀 4581

題目: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...