日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

贪心:remove K digits移除K个数字

發(fā)布時間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 贪心:remove K digits移除K个数字 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

問題描述:
已知一個使用字符串表示的非負(fù)整數(shù)num,將num中的k個數(shù)字移 除,求移除k個數(shù)字后,可以獲得的最小的可能的新數(shù)字。
例如:num = “1432219” , k = 3
在去掉3個數(shù)字后得到的很多很多可能里,如1432、4322、2219、1219
、1229…; 去掉數(shù)字4、3、2得到的1219最小!

  1. 貪心規(guī)律:
    根據(jù)以上舉例,移除三個數(shù)的過程中
    每一次我們移除一個數(shù)的時候,想要保證最終存儲的數(shù)是最小的,那么移除當(dāng)前數(shù)的條件就是下一個數(shù)小于當(dāng)前數(shù)。當(dāng)前數(shù)處于高位,下一個數(shù)顯然處于低位,那么保留較小的,即可保證高位是較小的。

    類似:遍歷到14 和143 時,發(fā)現(xiàn)3小于4,則將4移除,存儲的數(shù)據(jù)變?yōu)?3;

  2. 迭代策略:
    每一次的移除,保證在k的范圍內(nèi),保留的數(shù)是比上一位小的即可

實現(xiàn)過程可以使用棧來存儲最終的結(jié)果,出棧的條件即為以上所說的迭代策略。

實現(xiàn)如下(文末有完整測試代碼):

string remove_k_num(string &str,int k){/*使用vector,同樣支持類似于棧的操作*/vector<int> S;string result="";if (str == "" || k == 0) {return str;}int number;for (int i = 0;i < str.length(); ++i) {number = str[i] - '0';//將字符轉(zhuǎn)為數(shù)字/*迭代策略:保證k滿足的情況下,存儲數(shù)據(jù)的棧不為空,則每次迭代,將棧頂較大的移除*/while(0 != S.size() && S[S.size() -1] > number && k >0 ) {S.pop_back();k--;}/*處理0的情況,即0處在中間位置時才可以入棧,因為0不能做為數(shù)字的開頭,不屬于有效位*/if(number != 0 || S.size() != 0) {S.push_back(number);}}/*處理持續(xù)遞增的情況,類似12345,沒有出棧的,則即可從棧頂直接彈出*/while(S.size() != 0 && k >0) {S.pop_back();k--;}/*將棧中的整型數(shù)據(jù)轉(zhuǎn)為字符串最終返回*/for (int i =0;i < S.size(); ++i) {result.append(1,S[i] + '0');}if (result == "") {result = "0";}return result;
}

測試代碼如下:

#include <iostream>
#include <vector>
#include <stack>
#include <string>using namespace std;string remove_k_num(string &str,int k){vector<int> S;string result="";if (str == "" || k == 0) {return str;}int number;for (int i = 0;i < str.length(); ++i) {number = str[i] - '0';while(0 != S.size() && S[S.size() -1] > number && k >0 ) {S.pop_back();k--;}if(number != 0 || S.size() != 0) {S.push_back(number);}}while(S.size() != 0 && k >0) {S.pop_back();k--;}for (int i =0;i < S.size(); ++i) {result.append(1,S[i] + '0');}if (result == "") {result = "0";}return result;
}int main() {string s;int k;cout << "input the string and k " << endl;cin >> s;cin >> k;cout << "the min number is " << remove_k_num(s,k) << endl;return 0;
}

輸出如下:

input the string and k 
432895689 4
the min number is 25689input the string and k 
100010 2
the min number is 0

總結(jié)

以上是生活随笔為你收集整理的贪心:remove K digits移除K个数字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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