日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Leetcode402 remove-k-digits贪心+vector模拟栈的思想

發(fā)布時(shí)間:2025/4/5 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode402 remove-k-digits贪心+vector模拟栈的思想 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目

給定一個(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。

來(lái)源:力扣(LeetCode)
鏈接:原題鏈接

實(shí)現(xiàn)思路

貪心規(guī)律:從高位向低位遍歷,如果對(duì)應(yīng)的數(shù)字>下一位數(shù)字,則把該位去掉得到的數(shù)字最小。

相鄰位進(jìn)行比較,兩者小的進(jìn)棧

(這里需要注意存在零的情況。舉例,“10234” ,0比1小,1出棧,0入棧,此時(shí)如果0位于棧底,最后彈出顯示則0位于首位,這是錯(cuò)誤的)

棧頂彈出條件是:

  • 棧非空,
  • k大于0,
  • 棧頂元素>后面的元素
  • 接下來(lái)如果不是0,則可以直接進(jìn)棧。
    如果是0,需要考慮之前的棧非空
    這里結(jié)合為一句代碼:

    if(number!=0||!v.empty())v.push_back(number); //使用vector實(shí)現(xiàn)棧的思想

    核心代碼

    for(size_t i=0;i<num.size();++i){number=num[i]-'0';//轉(zhuǎn)換為數(shù)字while(k>0&&!v.empty()&&v.back()>number)//彈出棧頂?shù)臈l件{v.pop_back();//使用vector模擬棧,這里彈出k--;//需要減掉的元素?cái)?shù)少1}if(number!=0||!v.empty())v.push_back(number); }

    AC代碼

    class Solution { public:string removeKdigits(string num, int k) {vector<int> v;//模擬棧的思想string result="";int number;for(size_t i=0;i<num.size();++i){number=num[i]-'0';//轉(zhuǎn)換為數(shù)字while(k>0&&!v.empty()&&v.back()>number)//彈出棧頂?shù)臈l件{v.pop_back();k--;}if(number!=0||!v.empty())v.push_back(number); }while(k>0&&!v.empty()){k--;v.pop_back();}//數(shù)字轉(zhuǎn)換為字符串for(size_t i=0;i<v.size();++i){result.append(1,v[i]+'0');}if(result=="")//空串return "0";return result;} };

    未考慮到0的情況的代碼

    問(wèn)題出現(xiàn)在出現(xiàn)前導(dǎo)0,如下是問(wèn)題代碼

    while(k>0&&!v.empty()&&v.back()>number)//彈出棧頂?shù)臈l件{v.pop_back();k--;}if(number==0){//已知沒(méi)有前導(dǎo)0v.push_back(number);}else//直接入棧v.push_back(number);}

    總結(jié)

    后續(xù)整體添加。也可能遺忘。

    數(shù)字轉(zhuǎn)換為字符串
    使用字符串result的append()函數(shù)追加字符
    append()函數(shù)請(qǐng)參考:博客:C++append()函數(shù)的功能
    數(shù)字轉(zhuǎn)化為字符通過(guò)num+'0’

    //數(shù)字轉(zhuǎn)換為字符串for(size_t i=0;i<v.size();++i){result.append(1,v[i]+'0');}

    字符串轉(zhuǎn)化為數(shù)字:

    這個(gè)使用較多,比較簡(jiǎn)單
    字符串轉(zhuǎn)化為數(shù)字通過(guò) num-'0’

    //一位一位的轉(zhuǎn)換for(size_t i=0;i<num.size();++i){number=num[i]-'0';//轉(zhuǎn)換為數(shù)字//后續(xù)處理...}

    希望對(duì)你有幫助。

    總結(jié)

    以上是生活随笔為你收集整理的Leetcode402 remove-k-digits贪心+vector模拟栈的思想的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。