สมมติว่าเรามีจำนวนเต็มที่ไม่เป็นลบซึ่งแสดงเป็นสตริง เราต้องลบหลัก k ออกจากตัวเลขเพื่อให้ตัวเลขใหม่มีค่าน้อยที่สุด ดังนั้นหากอินพุตเป็น “1432219” และ k =3 ผลลัพธ์จะเป็น “1219”
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนด stack st สร้าง string ว่าง ret
-
n :=ขนาดของ num
-
สำหรับฉันอยู่ในช่วง 0 ถึง n – 1
-
ในขณะที่ k ไม่ใช่ศูนย์และ stack ไม่ว่างและด้านบนของ stack> num[i]
-
ลบออกจากสแต็กและลด k ลง 1
-
-
ใส่ num[i] ลงใน st
-
-
ในขณะที่ k ไม่ใช่ 0 ให้ลบองค์ประกอบออกจากสแต็ก
-
ในขณะที่สแต็กไม่ว่างเปล่า
-
ret :=ret + ด้านบนของ stack ลบองค์ประกอบออกจาก stack
-
-
ตอนนี้กลับสตริง ret
-
ans :=สตริงว่าง และ i :=0
-
ในขณะที่ i <ขนาดของ ret และ ret[i] ไม่ใช่ '0'
-
เพิ่มขึ้น 1
-
-
สำหรับฉัน <ขนาดของ ret
-
ans :=ans + ret[i]
-
-
ret :=ans
-
คืนค่า “0” หากขนาดของ ret เป็น 0 มิฉะนั้น ret
ตัวอย่าง (C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
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;
}
}; อินพุต
"1432219" 3
ผลลัพธ์
"1219"