解题思路

这是一个贪心算法题目。为了使保留下来的数字最大,我们需要:

  1. 从左往右遍历数字,每次删除一个数字时:

    • 找到第一个比后面数字小的位置
    • 删除该位置的数字
    • 这样可以保证剩余数字最大
  2. 重复上述过程 次,直到删除够指定数量的数字

代码

#include <iostream>
#include <string>
using namespace std;

int main() {
    string number;
    int cnt;
    cin >> number >> cnt;
    
    string result;
    int n = number.length();
    
    // 每次删除一个数字
    for(int i = 0; i < n; i++) {
        // 当前数字比栈顶小,且还可以删除数字时,删除栈顶
        while(!result.empty() && cnt > 0 && result.back() < number[i]) {
            result.pop_back();
            cnt--;
        }
        result.push_back(number[i]);
    }
    
    // 如果还需要删除数字,从末尾删除
    while(cnt > 0) {
        result.pop_back();
        cnt--;
    }
    
    cout << result << endl;
    return 0;
}
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String number = sc.next();
        int cnt = sc.nextInt();
        
        StringBuilder result = new StringBuilder();
        int n = number.length();
        
        // 每次删除一个数字
        for(int i = 0; i < n; i++) {
            char c = number.charAt(i);
            // 当前数字比栈顶小,且还可以删除数字时,删除栈顶
            while(result.length() > 0 && cnt > 0 && 
                  result.charAt(result.length()-1) < c) {
                result.setLength(result.length()-1);
                cnt--;
            }
            result.append(c);
        }
        
        // 如果还需要删除数字,从末尾删除
        while(cnt > 0) {
            result.setLength(result.length()-1);
            cnt--;
        }
        
        System.out.println(result.toString());
    }
}
def solve():
    number = input()
    cnt = int(input())
    
    result = []
    n = len(number)
    
    # 每次删除一个数字
    for i in range(n):
        # 当前数字比栈顶小,且还可以删除数字时,删除栈顶
        while result and cnt > 0 and result[-1] < number[i]:
            result.pop()
            cnt -= 1
        result.append(number[i])
    
    # 如果还需要删除数字,从末尾删除
    while cnt > 0:
        result.pop()
        cnt -= 1
    
    print(''.join(result))

if __name__ == "__main__":
    solve()

算法及复杂度

  • 算法:贪心算法
  • 时间复杂度:,其中 为数字长度
  • 空间复杂度:,需要存储结果字符串