移除K個數字
LeetCode 402. Remove K Digits
已知一個使用字串表示的非負整數num,將num中的k個數字移除, 求移除k個數字後,可以獲得的最小的可能的新數字。(num不會以0開頭,num長度小於10002)
輸入 : num = “1432219” , k = 3
在去掉3個數字後得到的很多很多可能裡,如1432、4322、2219、1219、 1229...;去掉數字4、3、2得到的1219最小!
class Solution{
public:
std::string removeKdigits(std::string num, int k){// 返回的結果用字串來表示
}
};
分析
假設 num = 1432219 ; k = 1, 分別去掉1, 4, 3, 2, 2, 1, 9 得到數字:
分析與常識:
若去掉某一位數字,為了使得到的新數字最小,需要儘可能讓得到的新數字優先 最高位最小,其次次高位最小, 再其次第3位最小...
演算法設計
使用棧儲存最終結果或刪除工作,從高位向低位遍歷num,
如果遍歷的數字大於棧頂元素,則將該數字push入棧
如果小於棧頂元素則進行pop彈棧,直到棧為空或不能再刪除數字
(k==0)或棧頂小於當前元素為止。
最終棧中從棧底到棧頂儲存的數字,即為結果。
邊界條件
1.當所有數字都掃描完成後,k仍然>0,應該做怎樣的處理? 例如: num = 12345, k = 3 時。
2.當數字中有0出現時,應該有怎樣的特殊處理? 例如: num = 100200, k = 1 時。
3.如何將最後結果儲存為字串並返回?
class Solution{
public:
std::string removeKdigits(std::string num, int k){
std::vector<int> S;//使用vector當作棧(因為vector可以遍歷)
std::string result = "";儲存最終結果的字串
for(int i = 0;i <num.length();i++){//最高位迴圈掃描數字num
int number = num[i] - '0';//將字元型num轉換整數;
while(S.size() != 0 && S[S.size() -1]>number && k>0){//當棧不空,棧頂元素大於number
S.pop_back();
k --;
}
if(number !=0 || S.size() != 0){
S.push_back(number);
}
while(S.size() && k>0){//如果棧不空仍然可以刪除數字
S.pop_back();
k--;
for(int i = 0;i<S.size();i++){
result.append(1,'0'+S[i]);//轉換成字串
}
if(result == ""){
result = "0";
}
return result;
}
};
相關文章
- 移掉 K 位數字
- 求最小k個數
- 0828-T1 移除數
- [知春路-數字聯盟]火爆招聘PHP開發!!!!!薪酬15K-30KPHP
- JZ-029-最小的 K 個數
- Kmeans如何確定聚類個數K聚類
- LeetCode 402 移掉K位數字 HERODING的LeetCode之路LeetCode
- 找出陣列中第 k 大的數字及其出現次數陣列
- C#判斷一個字串是否是數字或者含有某個數字C#字串
- 每日一練(21):最小的k個數
- 數字示波器哪個品牌好
- Nth Digit 第N個數字Git
- k8s系列--node(k8s節點介紹,新增節點,移除節點)K8S
- LeetCode 1837[K進製表示下的各位數字總和]LeetCode
- 402. 移掉K位數字 (按位考慮 貪心)
- 連結串列倒數第k個結點
- 劍指Offer-31-最小的K個數
- 劍指offer:輸入n個整數,找出其中最小的K個數。
- 分治與遞迴-找k個臨近中位數的數遞迴
- 和為s的兩個數字
- HOME: Count Digits —— 計算字串中數字個數Git字串
- [work] python list中數字與一個數相乘Python
- 求陣列中k個數的所有組合陣列
- 找到無序陣列中最小的k個數陣列
- Leetcode 劍指 Offer 40. 最小的k個數LeetCode
- 1102:與指定數字相同的數的個數(C C++)C++
- 五個步驟移除約束瓶頸 - sbj
- 深度分享:數字化,轉型個啥?
- [每日一題] 第二十題:最小的k個數每日一題
- 統計輸入的數字為正數和負數的個數
- python中關鍵字引數的個數有限制嗎?Python
- //編寫一個函式,傳入一個整數,將數字反轉,檢查數字是不是數字的2倍 果是則返回true,否則返回false函式False
- 2022-07-11:給定n位長的數字字串和正數k,求該子符串能被k整除的子串個數。 (n<=1000,k<=100)字串
- 數字化轉型的七個槓桿
- LeetCode878. 第 N 個神奇數字(java)LeetCodeJava
- 用PriorityQueue解決選擇最小的K個數問題
- 數字索引賦值給多個變數簡單表示式索引賦值變數
- 27,移除元素