列表

详情


NC219. 移掉 K 位数字

描述

给定一个以字符串表示的数字 num 和一个数字 k ,从 num 中移除 k 位数字,使得剩下的数字最小。如果可以删除全部数字,则结果为 0。
1.num仅有数字组成
2.num是合法的数字,不含前导0
3.删除之后的num,请去掉前导0(不算在移除次数中)

数据范围:num的长度满足 ,保证 num 中仅包含 0~9 的十进制数

示例1

输入:

"1432219",3

输出:

"1219"

说明:

移除 4 3 2 后剩下 1219

示例2

输入:

"10",1

输出:

"0"

示例3

输入:

"100999",3

输出:

"9"

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 400KB, 提交时间: 2022-05-27

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num string字符串 
     * @param k int整型 
     * @return string字符串
     */
    string removeKnums(string num, int k) {
        string res = "0";
        for(auto s : num) {
            while(k && res.back() > s) {
                res.pop_back();
                k--;
            }
            res += s;
        }
        while(k--) res.pop_back();
        int i = 0;
        while(i < res.size() && res[i] == '0') i++;
        if(i == res.size()) return "0";
        return res.substr(i);
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 400KB, 提交时间: 2022-05-20

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num string字符串 
     * @param k int整型 
     * @return string字符串
     */
    string removeKnums(string num, int k) {
        std::stack<char> stk;
        int i = 0;
        for (;i < num.size(); i++)
        {
            while (!stk.empty() && stk.top() >= num[i] && k)
            {
                if(stk.top() != '0')
                    k--;
                stk.pop();
            }
            if(k == 0)
                break;
            stk.push(num[i]);
        }
        std::string ret = "";
        while (!stk.empty())
        {
            ret =stk.top()+ret;
            stk.pop();
        }
        ret+= num.substr(i);
        int j = 0;
        while (j < ret.size()-1)
        {
            if (ret[j] == '0')
            {
                j++;
            }
            else
                break;
        }
        return ret.substr(j);
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-05-14

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num string字符串 
     * @param k int整型 
     * @return string字符串
     */
    string removeKnums(string num, int k) {
        // write code here
        vector<char> s;
        s.push_back(num[0]);
        int i = 0;
        for(int i=1; i < num.size(); i++){
            while(!s.empty() && s.back() >= num[i] && k > 0) {
                s.pop_back();
                k--;
            }
            if(s.empty() && num[i]=='0')
                continue;
            s.push_back(num[i]);
        }
        string sr;
        for(auto a:s){
            sr+=a;
        }
        return (sr.empty() ? "0" : sr);
    }
};

C 解法, 执行用时: 3ms, 内存消耗: 420KB, 提交时间: 2022-06-09

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param num string字符串 
 * @param k int整型 
 * @return string字符串
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
char* removeKnums(char* num, int k ) {
    int numLen = strlen(num);
    if (k >= numLen) {
        char *result = (char *)malloc(sizeof(char) * (2));
        result[0] = '0';
        result[1] = '\0';
        return result;
    }
    
    char *stack = (char *)malloc(sizeof(char) * numLen);
    int sTop = 0, delCount = 0;
    for (int i = 0; i < numLen; i++) {
        while (sTop > 0 && delCount < k && stack[sTop-1] > num[i]) {
            sTop--;
            delCount++;
        }
        stack[sTop++] = num[i];
    }
    
    while (delCount < k && sTop > 0) {
        sTop--;
        delCount++;
    }
    
    char *result = (char *)malloc(sizeof(char) * (sTop + 2));
    int rIndex = 0;
    for (int i = 0; i < sTop; i++) {
        if (rIndex == 0 && stack[i] == '0') {
            continue;
        } else {
            result[rIndex++] = stack[i];
        }
    }
    if (rIndex == 0) {
        result[rIndex++] = '0';
    }
    result[rIndex++] = '\0';
    
    free(stack);
    
    return result;
}




C++ 解法, 执行用时: 3ms, 内存消耗: 420KB, 提交时间: 2022-03-11

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num string字符串 
     * @param k int整型 
     * @return string字符串
     */
    string removeKnums(string num, int k) {
        // write code here
        string res = "";
        int r = 0;
        while(r<num.size()){
            if(!res.empty()&&res[0]=='0'){
                res = res.substr(1,res.size()-1);
            }
            if(res.empty()||res.back()<num[r]){
                res+=num[r];
                r++;
            }else if(k>0){
                res.pop_back();
                k--;
            }else{
                res+=num[r];
                r++;
            }
            
        }
        while(k>0){
            res.pop_back();
            k--;
        }
        
        return res.size()==0?"0":res;
    }
};

上一题