LeetCode 刷題小結(jié)雜談(二)

這節(jié)我們繼續(xù)來匯總一些LeetCode題



找到所有數(shù)組中消失的數(shù)字

給定一個范圍在 1 ≤ a[i] ≤ n ( n = 數(shù)組大小 ) 的 整型數(shù)組价淌,數(shù)組中的元素一些出現(xiàn)了兩次丈莺,另一些只出現(xiàn)一次走诞。

找到所有在 [1, n] 范圍之間沒有出現(xiàn)在數(shù)組中的數(shù)字鞍陨。

您能在不使用額外空間且時間復(fù)雜度為O(n)的情況下完成這個任務(wù)嗎? 你可以假定返回的數(shù)組不算在額外空間內(nèi)洪燥。

示例:

輸入:
[4,3,2,7,8,2,3,1]

輸出:
[5,6]

這個題如果沒有限制的話霉祸,還是很簡單的,使用哈希表等相關(guān)方法都可以解決犁珠。

但這里要求我們在不使用額外空間且時間復(fù)雜度為O(n)的情況下完成逻炊,簡單來說就是在原數(shù)組中操作(額外定義的基本變量不算),且一次遍歷就完成犁享。

如何做呢余素?考慮題意,數(shù)組中數(shù)據(jù)的范圍是 1 ≤ a[i] ≤ n 炊昆,那我們就需要充分利用這個信息桨吊,任意一個數(shù)組中的元素絕對值減一后都可以作為下標(biāo)去訪問該數(shù)組中其他元素,要是能夠標(biāo)記這次訪問凤巨,就意味著這個元素至少出現(xiàn)了一次屏积,那沒有標(biāo)記的元素就是沒有出現(xiàn)的了。

以這個思路磅甩,我們就可以很容易解決了。

class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        for(int i=0;i<nums.size();i++){
            //以該元素的絕對值減一為索引標(biāo)記元素
            int index = abs(nums[i])-1;
            if(nums[index]>0){
                nums[index] *= -1;
            }
        }
        vector<int> res;
        for(int i=1;i<=nums.size();i++){
            //大于0表示沒有出現(xiàn)過
            if(nums[i-1]>0){
                res.push_back(i);
            }
        }
        return res;
    }
};

有序隊列

給出了一個由小寫字母組成的字符串 S姥卢。然后卷要,我們可以進(jìn)行任意次數(shù)的移動渣聚。

在每次移動中,我們選擇前 K 個字母中的一個(從左側(cè)開始)僧叉,將其從原位置移除奕枝,并放置在字符串的末尾。

返回我們在任意次數(shù)的移動之后可以擁有的按字典順序排列的最小字符串瓶堕。

示例 1:

輸入:S = "cba", K = 1
輸出:"acb"
解釋:
在第一步中隘道,我們將第一個字符(“c”)移動到最后,獲得字符串 “bac”郎笆。
在第二步中谭梗,我們將第一個字符(“b”)移動到最后,獲得最終結(jié)果 “acb”宛蚓。

示例 2:

輸入:S = "baaca", K = 3
輸出:"aaabc"
解釋:
在第一步中激捏,我們將第一個字符(“b”)移動到最后,獲得字符串 “aacab”凄吏。
在第二步中远舅,我們將第三個字符(“c”)移動到最后,獲得最終結(jié)果 “aaabc”痕钢。

當(dāng) K = 1 時图柏,每次操作只能將第一個字符移動到末尾,因此字符串 S 可以看成一個頭尾相連的環(huán)任连。如果 S 的長度為 N蚤吹,我們只需要找出這 N 個位置中字典序最小的字符串即可。

當(dāng) K >1 時课梳,其實就相當(dāng)于冒泡排序距辆,交換兩個元素,比較 K = 1 時暮刃,我們能在S上得到一個字典序最小的隊列跨算,得到一個升序排列的隊列。

class Solution {
public:
    string orderlyQueue(string S, int K) {
        if(K>1){
            sort(S.begin(),S.end());
            return S;
        }
        string res=S;
        for(int i=0;i<S.size();i++){
            string tmp = S.substr(i)+S.substr(0,i);
            if(tmp<res){
                res=tmp;
            }
        }
        return res;
    }
};

兩數(shù)相加 II

給你兩個 非空 鏈表來代表兩個非負(fù)整數(shù)椭懊。數(shù)字最高位位于鏈表開始位置诸蚕。它們的每個節(jié)點只存儲一位數(shù)字。將這兩數(shù)相加會返回一個新的鏈表氧猬。

你可以假設(shè)除了數(shù)字 0 之外背犯,這兩個數(shù)字都不會以零開頭。

進(jìn)階:

如果輸入鏈表不能修改該如何處理盅抚?換句話說漠魏,你不能對列表中的節(jié)點進(jìn)行翻轉(zhuǎn)。

示例:

輸入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 8 -> 0 -> 7

這個題算是鏈表中的常規(guī)題吧妄均,需要注意的是數(shù)字最高位位于鏈表開始位置柱锹,如果不修改鏈表的話哪自,不妨使用棧來保存節(jié)點域,相加存入鏈表禁熏。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        stack<int> s1=fun(l1);
        stack<int> s2=fun(l2);
        return s1.size()>s2.size()?add(s1,s2):add(s2,s1);
    }
    stack<int> fun(ListNode* l){
        stack<int> s;
        ListNode* p=l;
        while(p){
            s.push(p->val);
            p=p->next;
        }
        return s;
    }
    ListNode* add(stack<int>& s1,stack<int>& s2){
        //默認(rèn)s1大于等于s2
        int len1=s1.size();
        int len2=s2.size();
        ListNode* res=nullptr;
        int tmp=0;
        len1=len1-len2;
        while(len2--){
            int num1=s1.top();
            s1.pop();
            int num2=s2.top();
            s2.pop();
            ListNode* node=new ListNode((num1+num2+tmp)%10);
            tmp=(num1+num2+tmp)/10;
            node->next=res;
            res=node;
        }
        while(len1--){
            int num=s1.top();
            s1.pop();
            ListNode* node=new ListNode((num+tmp)%10);
            tmp=(num+tmp)/10;
            node->next=res;
            res=node;
        }
        if(tmp){
            ListNode* node=new ListNode(1);
            node->next=res;
            res=node;
        }
        return res;
    }
};

這個寫得有些啰嗦壤巷,但是總體上問題不大。

卡牌分組

給定一副牌瞧毙,每張牌上都寫著一個整數(shù)胧华。

此時,你需要選定一個數(shù)字 X宙彪,使我們可以將整副牌按下述規(guī)則分成 1 組或更多組:

每組都有 X 張牌矩动。
組內(nèi)所有的牌上都寫著相同的整數(shù)。

僅當(dāng)你可選的 X >= 2 時返回 true您访。

圖片.png
圖片.png

統(tǒng)計每個數(shù)出現(xiàn)的次數(shù)铅忿,若所有的次數(shù)的公約數(shù)大于2,則滿足條件灵汪。

class Solution {
public:
    bool hasGroupsSizeX(vector<int>& deck) {
        map<int,int> m;
        for(int i=0;i<deck.size();i++){
            m[deck[i]]++;
        }
        int sum=-1;
        auto b = m.begin();
        while(b!=m.end()){
            if(sum==-1){
                sum=b->second;
            }else{
                sum=gcd(sum,b->second);
            }
            b++;
        }
        return sum>=2;
    }
    int gcd(int x,int y){
        return x==0?y:gcd(y%x,x);
    }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末檀训,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子享言,更是在濱河造成了極大的恐慌峻凫,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件览露,死亡現(xiàn)場離奇詭異荧琼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)差牛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門命锄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人偏化,你說我怎么就攤上這事脐恩。” “怎么了侦讨?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵驶冒,是天一觀的道長。 經(jīng)常有香客問我韵卤,道長骗污,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任沈条,我火速辦了婚禮需忿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己贴谎,他們只是感情好汞扎,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著擅这,像睡著了一般。 火紅的嫁衣襯著肌膚如雪景鼠。 梳的紋絲不亂的頭發(fā)上仲翎,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音铛漓,去河邊找鬼溯香。 笑死,一個胖子當(dāng)著我的面吹牛浓恶,可吹牛的內(nèi)容都是我干的玫坛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼包晰,長吁一口氣:“原來是場噩夢啊……” “哼湿镀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伐憾,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤勉痴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后树肃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒸矛,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年胸嘴,在試婚紗的時候發(fā)現(xiàn)自己被綠了雏掠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡劣像,死狀恐怖乡话,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驾讲,我是刑警寧澤蚊伞,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站吮铭,受9級特大地震影響时迫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谓晌,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一掠拳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纸肉,春花似錦溺欧、人聲如沸喊熟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芥牌。三九已至,卻和暖如春聂使,著一層夾襖步出監(jiān)牢的瞬間壁拉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工柏靶, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留弃理,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓屎蜓,卻偏偏與公主長得像痘昌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子炬转,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,340評論 0 2
  • 1. 找出數(shù)組中重復(fù)的數(shù)字 題目:在一個長度為n的數(shù)組里的所有數(shù)字都在0到n-1的范圍內(nèi)辆苔。數(shù)組中某些數(shù)字是重復(fù)的,...
    BookThief閱讀 1,762評論 0 2
  • 計算機(jī)二級C語言上機(jī)題庫(南開版) 1.m個人的成績存放在score數(shù)組中返吻,請編寫函數(shù)fun,它的功能是:將低于平...
    MrSunbeam閱讀 6,354評論 1 42
  • 1.二維數(shù)組的查找 在一個二維數(shù)組中(每個一維數(shù)組的長度相同)姑子,每一行都按照從左到右遞增的順序排序,每一列都按照從...
    linjiason閱讀 729評論 0 0
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,380評論 0 5