題目: LeetCode - 402. Remove K Digits
題目說明 給一個字串及一個整數 k
,字串代表一個整數,求刪除 k
個數字後,結果是最小的數字。
解題思路
想法: 由於數字比大小是從高位往低位比,所以我們的目的是讓高位數盡可能的小。
解法一: 定義一個字串 res
,遍歷 num,若是 res 的最後一位數比現在遍歷到的元素大,就刪除最後一位數,直到已經刪除了 k
個數字,或是 res
已經刪除光了。最後再 res.resize(digits)
,因為我們只需要 digits
位數,而後面的數字一定會比前面的大,所以直接刪除掉後面的數字。最後如果 res
前面是 0 的話就把 0 拿掉即可。
解法二: 和解法一類似,只是在放入的時候就判斷是否有 leading zero 的情況。
解法三: 和解法二相同,只是不再定義新的字串,而是將直接將結果存在 num
裡面。
參考解法 解法一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class Solution {public : string removeKdigits (string num, int k) { int n = num.size(); if (n == k) return "0" ; int digits = n - k; string res; for (auto i : num) { while (k && !res.empty() && res.back() > i) res.pop_back(), --k; res.push_back(i); } res.resize(digits); while (!res.empty() && res.front() == '0' ) res.erase(res.begin()); return res.empty() ? "0" : res; } };
解法二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Solution {public : string removeKdigits (string num, int k) { int n = num.size(); if (n == k) return "0" ; string res; for (auto i : num) { while (k && !res.empty() && res.back() > i) res.pop_back(), --k; if (!res.empty() || i != '0' ) res.push_back(i); } while (k--) res.pop_back(); return res.empty() ? "0" : res; } };
解法三:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Solution {public : string removeKdigits (string num, int k) { int n = num.size(); if (n == k) return "0" ; int size = 0 ; for (auto i : num) { while (k && size && num[size - 1 ] > i) --size, --k; if (size || i != '0' ) num[size++] = i; } num.resize(size - k); return num.empty() ? "0" : num; } };