Leetcode402撩嚼、移掉K位數(shù)字

1、問題描述

給定一個(gè)以字符串表示的非負(fù)整數(shù) num挖帘,移除這個(gè)數(shù)中的 k 位數(shù)字完丽,使得剩下的數(shù)字最小。

注意:

  • num 的長(zhǎng)度小于 10002 且 ≥ k拇舀。
  • num 不會(huì)包含任何前導(dǎo)零逻族。

示例 1 :

輸入: num = "1432219", k = 3
輸出: "1219"
解釋: 移除掉三個(gè)數(shù)字 4, 3, 和 2 形成一個(gè)新的最小的數(shù)字 1219。
示例 2 :

輸入: num = "10200", k = 1
輸出: "200"
解釋: 移掉首位的 1 剩下的數(shù)字為 200. 注意輸出不能有任何前導(dǎo)零骄崩。
示例 3 :

輸入: num = "10", k = 2
輸出: "0"
解釋: 從原數(shù)字移除所有的數(shù)字聘鳞,剩余為空就是0薄辅。

2、思考與分析

3抠璃、貪心規(guī)律

4站楚、使用棧來優(yōu)化求解

5、需要注意的問題

  • 當(dāng)所有數(shù)字都掃描完成后搏嗡,k仍然>0窿春,應(yīng)該做怎樣的處理? 例如: num = 12345, k = 3 時(shí)采盒。
  • 當(dāng)數(shù)字中有0出現(xiàn)時(shí)旧乞,應(yīng)該有怎樣的特殊處理? 例如: num = 100200, k = 1 時(shí)。
  • 如何將最后結(jié)果存儲(chǔ)為字符串并返回?

6磅氨、代碼實(shí)現(xiàn)

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Solution
{
public:
    string removeKdigits(string num, int k)
    {
        vector<int> S;  // 使用vector當(dāng)作棧尺栖,方便遍歷操作
        string result = "";  // 存儲(chǔ)最終結(jié)果

        for (int i = 0; i < num.length(); i++)  // num.size() is ok!
        {
            int number = num[i] - '0';  // 數(shù)字字符轉(zhuǎn)整型數(shù)字 '3' -> 3

            // 這個(gè)循環(huán)的作用是:在k還有機(jī)會(huì)的情況下(k > 0),
            // 要將S中烦租,從后到前延赌,比number大的全部刪除掉
            while (S.size() != 0 && S[S.size() - 1] > number && k > 0)
            {
                // S.size() != 0 說明還沒有將num的字符壓入到S中,或者被彈空了
                // S[S.size() - 1] > num 說明新來的數(shù)字小左权,比當(dāng)前S尾部的元素值更有利于使整體變小
                // k > 0 說明還有機(jī)會(huì)刪除數(shù)字
                S.pop_back();  // 當(dāng)上述三個(gè)條件都滿足時(shí)皮胡,彈出S尾部元素
                k --;  // 用掉一次彈出數(shù)字的機(jī)會(huì)
            }

            // 如果上述循環(huán)不滿足條件
            // 如果number != 0 ,那就可以將其壓入
            // 如果number == 0赏迟,但只要S.size() != 0就可以將其壓入
            // 這兩點(diǎn)保證是因?yàn)椋瑪?shù)字不能以一個(gè)0或者一串連續(xù)的0開頭
            // if (number != 0 || S.size() != 0)
            if (number != 0)
            {
                // 只所以能到這一步蠢棱,是因?yàn)楸仍搉umber大的锌杀,在k > 0范圍內(nèi),全部被干掉了泻仙,
                // 當(dāng)前S.size()會(huì)終止一下
                // 不過當(dāng)前number是0的話糕再,雖然全部把前面的干掉了,但是0不能當(dāng)作首元素
                S.push_back(number);
            }
        }

        // 這種情況是玉转,k的次數(shù)沒有用完突想,就像12345678這種一樣
        // 注意:這里的S.size() != 0 是有必要的,因?yàn)樽詈罂赡苤皇A宋膊康?
        // 而這些0是沒有壓入的S中究抓,所以這種情況就是猾担,S為空,但k > 0還滿足刺下,num也遍歷完了
        while (S.size() != 0 && k > 0)
        {
            // 只能從尾部用剩下的機(jī)會(huì)刪除
            S.pop_back();
            k --;
        }

        // 到目前位置绑嘹,S中剩下的元素,就是經(jīng)過元素刪除后滿足條件的
        for (int i = 0; i < S.size(); i ++)
        {
            result.append(1, '0' + S[i]);
        }

        if (result == "")
        {
            result = "0";
        }

        return result;
    }
};

int main()
{
    string num = "10200";

    int k = 1;
    Solution S;
    string res = S.removeKdigits(num, k);

    cout << res << endl;
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末橘茉,一起剝皮案震驚了整個(gè)濱河市工腋,隨后出現(xiàn)的幾起案子姨丈,更是在濱河造成了極大的恐慌,老刑警劉巖擅腰,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蟋恬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡趁冈,警方通過查閱死者的電腦和手機(jī)筋现,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來箱歧,“玉大人矾飞,你說我怎么就攤上這事⊙叫希” “怎么了洒沦?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)价淌。 經(jīng)常有香客問我申眼,道長(zhǎng),這世上最難降的妖魔是什么蝉衣? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任括尸,我火速辦了婚禮,結(jié)果婚禮上病毡,老公的妹妹穿的比我還像新娘濒翻。我一直安慰自己,他們只是感情好啦膜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布有送。 她就那樣靜靜地躺著,像睡著了一般僧家。 火紅的嫁衣襯著肌膚如雪雀摘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天八拱,我揣著相機(jī)與錄音阵赠,去河邊找鬼。 笑死肌稻,一個(gè)胖子當(dāng)著我的面吹牛清蚀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灯萍,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼轧铁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了旦棉?” 一聲冷哼從身側(cè)響起齿风,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤药薯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后救斑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體童本,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年脸候,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了穷娱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡运沦,死狀恐怖泵额,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情携添,我是刑警寧澤嫁盲,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站烈掠,受9級(jí)特大地震影響羞秤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜左敌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一瘾蛋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矫限,春花似錦哺哼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咬扇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間廊勃,已是汗流浹背懈贺。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坡垫,地道東北人梭灿。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像冰悠,于是被迫代替她去往敵國(guó)和親堡妒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354