Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ลบ K Digits ใน C ++


สมมติว่าเรามีจำนวนเต็มที่ไม่เป็นลบซึ่งแสดงเป็นสตริง เราต้องลบหลัก 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"