給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。
注意:num 的長度小於 10002 且 ≥ k。
num 不會包含任何前導零。
示例 1 :
輸入: num = 「1432219」, k = 3
輸出: 「1219」
解釋: 移除掉三個數字 4, 3, 和 2 形成乙個新的最小的數字 1219。
示例 2 :
輸入: num = 「10200」, k = 1
輸出: 「200」
解釋: 移掉首位的 1 剩下的數字為 200. 注意輸出不能有任何前導零。
示例 3 :
輸入: num = 「10」, k = 2
輸出: 「0」
解釋: 從原數字移除所有的數字,剩餘為空就是0。
分析:
若去掉某一位數字,為了使得到的新數字最小,需要盡可能讓得到的新數字優先最高位最小,其次次高位最小,再其次第三位最小。
例如:乙個4位數「 1***」 ,一定比任何「8***」、「 8***」、…、「 2***」小!
乙個4位數若最高位確定,如「 51**」一定比任何「 59**」、「58**」、… 、「 52**」小!
乙個4位數若最高、次高位確定,如「 531*」一定比任何「 539*」、「538*」、… 、「 532*」小!
注意:
1.當所有數字都掃瞄完成後,k仍然》0,應該做怎樣的處理?例如: num = 12345,k = 3 時。
2.當數字中有0出現時,應該有怎樣的特殊處理?例如: num = 100200, k = 1 時。
#include
#include
#include
#include
using
namespace std;
class
solution
//當number=0時,只有棧中有元素才能入棧
if(number !=
0|| v.
size()
!=0)}
//所有數字掃瞄完後,k任然大於0,則出棧k位
while
(v.size()
!=0&& k >0)
for(
int i =
0; i < v.
size()
; i++)if
(res =="")
return res;
}//求k位最大的子串行
void
removekdigits2
(string num,
int k)
vector<
int> res;
int pop = n-k;
//要移除n-k個數
for(
int i =
0; i < n; i++
) res.
push_back
(number);}
res.
resize
(k);
for(
int i =
0; i < k; i++)
cout<
;int
main
(void
)
leetcode 4 羅馬數字轉整數
羅馬數字包含以下七種字元 i,v,x,l,c,d 和 m。字元 數值 i 1 v 5 x 10 l 50 c 100 d 500 m 1000 例如,羅馬數字 2 寫做 ii 即為兩個並列的 1。12 寫做 xii 即為 x ii 27 寫做 xxvii,即為 xx v ii 通常情況下,羅馬數字中...
LeetCode 4 動態規劃
揹包問題c 動態規劃 class solution for int i 1 i n i for int j 0 j w weight i j for int i w i 0 i return0 1.word break leetcode 139 class solution return res s...
leetcode 4 尋找中位數
1.題目鏈結。這個題目使用分治來寫似乎不是很好想。大概的寫法就是 我們需要使用分治一步一步的找到中位數在哪個位置。我們首先在兩個陣列各自取出一總長度一半的資料,判斷取出來的資料的最大值,確定中位數到底在哪個區間。555,語言表達能力不強,看 吧,還是很好理解的。class solution 遞迴的出...