目錄
一、題目描述
二、解題思路
三、**實現
給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。
注意:
示例 1 :
輸入: num = "1432219", k = 3示例 2 :輸出: "1219"
解釋: 移除掉三個數字 4, 3, 和 2 形成乙個新的最小的數字 1219。
輸入: num = "10200", k = 1示例 3 :輸出: "200"
解釋: 移掉首位的 1 剩下的數字為 200. 注意輸出不能有任何前導零。
輸入: num = "10", k = 2本題的難點在於怎麼找數,要使找到的數盡可能的小且不能改變相對的順序,就意味著從左往右的遍歷,對於當前正在遍歷的數而言,如果前面的數比它大,那就要將其移除,這樣新得到的數會更小,舉例來說,1432219,如果現在遍歷到的數是3,那麼前面的4就要移除,因為14開頭的數會比13開頭的數大,同樣當遍歷到2時,前面的3就要移除,因為13開頭的數要比12開頭的數大;對每乙個數字都進行這樣的操作,最終得到結果。輸出: "0"
解釋: 從原數字移除所有的數字,剩餘為空就是0。
如果想到了上述的操作流程,那麼資料結構也就好選了,滿足後進先出的結構那就是棧了。
還有一些細節需要注意的是,此題在遍歷過程中並不一定能把所有要移除的數都找出來;還要注意結果中的前導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 解釋 移...