leetCode 402 移掉k位數字

2021-10-10 14:03:51 字數 1501 閱讀 1907

目錄

一、題目描述

二、解題思路

三、**實現

給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。

注意:

示例 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。

本題的難點在於怎麼找數,要使找到的數盡可能的小且不能改變相對的順序,就意味著從左往右的遍歷,對於當前正在遍歷的數而言,如果前面的數比它大,那就要將其移除,這樣新得到的數會更小,舉例來說,1432219,如果現在遍歷到的數是3,那麼前面的4就要移除,因為14開頭的數會比13開頭的數大,同樣當遍歷到2時,前面的3就要移除,因為13開頭的數要比12開頭的數大;對每乙個數字都進行這樣的操作,最終得到結果。

如果想到了上述的操作流程,那麼資料結構也就好選了,滿足後進先出的結構那就是棧了。

還有一些細節需要注意的是,此題在遍歷過程中並不一定能把所有要移除的數都找出來;還要注意結果中的前導0的處理。

到這裡,這道題基本上就沒有什麼問題了。

#includeusing namespace std;

string removekdigits(string num, int k)

chsta.push(num[i]);

} //如果彈出的數量沒有k個,說明資料中間是維持公升序的(比如乙個公升序的序列:112345)

//那麼要刪除的資料處在末尾,彈出末尾對應的數量的數字即可

while (k)

//拿出棧中的資料放到string中

while (!chsta.empty())

//逆置string

reverse(res.begin(), res.end());

//處理開頭的『0'

if (res[0] == '0') else

break;

} }if (res == "") return "0";

return res;

}int main()

強調一下:單調棧的使用一定是棧頂元素大於當前數才彈出,否則在特殊情況時的結果是不對的,要注意這個坑,調了一上午……

leetcode402移掉K位數

給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。注意 num 的長度小於 10002 且 k。num 不會包含任何前導零。示例 1 輸入 num 1432219 k 3 輸出 1219 解釋 移除掉三個數字 4,3,和 2 形成乙個新的最小的數字 1219。思路...

LeetCode 402 移掉K位數字

給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。注意 num 的長度小於 10002 且 k。num 不會包含任何前導零。示例 1 輸入 num 1432219 k 3 輸出 1219 解釋 移除掉三個數字 4,3,和 2 形成乙個新的最小的數字 1219。示例...

LeetCode 402 移掉K位數字

題目鏈結 題目描述 給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。注意 示例 輸入 num 1432219 k 3 輸出 1219 解釋 移除掉三個數字 4,3,和 2 形成乙個新的最小的數字 1219。輸入 num 10200 k 1 輸出 200 解釋 移...