Leetcode402 remove-k-digits贪心+vector模拟栈的思想
題目
給定一個(gè)以字符串表示的非負(fù)整數(shù) num,移除這個(gè)數(shù)中的 k 位數(shù)字,使得剩下的數(shù)字最小。
注意:
num 的長(zhǎng)度小于 10002 且 ≥ k。
num 不會(huì)包含任何前導(dǎo)零。
來(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ò)誤的)
棧頂彈出條件是:
接下來(lái)如果不是0,則可以直接進(jìn)棧。
如果是0,需要考慮之前的棧非空。
這里結(jié)合為一句代碼:
核心代碼
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’
字符串轉(zhuǎn)化為數(shù)字:
這個(gè)使用較多,比較簡(jiǎn)單
字符串轉(zhuǎn)化為數(shù)字通過(guò) num-'0’
希望對(duì)你有幫助。
總結(jié)
以上是生活随笔為你收集整理的Leetcode402 remove-k-digits贪心+vector模拟栈的思想的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 途胜机油尺F到L是多少升机油?
- 下一篇: kattis ones简单题取模运算+枚