移除k個數字 LeetCode402

2021-10-08 21:00:30 字數 1823 閱讀 7524

給定乙個以字串表示的非負整數 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 遞迴的出...