Giả sử chúng ta có số nguyên không âm num được biểu diễn dưới dạng chuỗi, chúng ta phải xóa k chữ số khỏi số để số mới là nhỏ nhất có thể. Vì vậy, nếu đầu vào là “1432219” và k =3, thì kết quả sẽ là “1219”.
Để giải quyết vấn đề này, chúng ta sẽ làm theo các bước sau -
-
Xác định một st ngăn xếp, tạo một chuỗi rỗng ret
-
n:=kích thước của num
-
cho tôi trong phạm vi từ 0 đến n - 1
-
trong khi k khác 0 và ngăn xếp không trống và đầu ngăn xếp> num [i]
-
xóa khỏi ngăn xếp và giảm k đi 1
-
-
chèn num [i] vào st
-
-
trong khi k không phải là 0, hãy xóa phần tử khỏi ngăn xếp
-
trong khi ngăn xếp không trống
-
ret:=ret + đầu ngăn xếp, xóa phần tử khỏi ngăn xếp
-
-
bây giờ đảo ngược chuỗi ret
-
ans:=một chuỗi trống và i:=0
-
trong khi i
-
tăng tôi lên 1
-
-
cho tôi
-
ans:=ans + ret [i]
-
-
ret:=ans
-
trả về “0” nếu kích thước của ret là 0, ngược lại, ret
Ví dụ (C ++)
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
class Solution {
public:
string removeKdigits(string num, int k) {
stack st;
string ret = "";
int n = num.size();
for(int i = 0; i < n; i++){
while(k && !st.empty() && st.top() > num[i]){
st.pop();
k--;
}
st.push(num[i]);
}
while(k--)st.pop();
while(!st.empty()){
ret += st.top();
st.pop();
}
reverse(ret.begin(), ret.end());
string ans = "";
int i = 0;
while(i <ret.size() && ret[i] == '0')i++;
for(; i < ret.size(); i++)ans += ret[i];
ret = ans;
return ret.size() == 0? "0" : ret;
}
}; Đầu vào
"1432219" 3
Đầu ra
"1219"