zoukankan      html  css  js  c++  java
  • Leetcode 402:移除K个数字

    要求:已知一个使用字符串表示的非负整数num,将num中的k个数字移
    除,求移除k个数字后,可以获得的最小的可能的新数字。

    选自Leetcode 402:移除K个数字

    分析:

    1. 为了使新数字更小,从最左端到最右端,每位数字尽可能最小。
    2. 通过一个单调栈(栈底——栈顶:单调增),遍历整个字符串,将其每个字符入栈;
    3. 入栈过程中,将栈顶元素与需要入栈字符进行对比,若栈顶元素较大,则弹出栈顶元素,将较大字符入栈;
    4. 每次出栈后,同时由于移除了一个元素,需要将k-1;

    各种特殊情况:
    如果是i==0结束的循环, 则 k 可能不等于0, 移除掉stk末尾k个元素;

    如果是k==0结束的循环, 则 i 可能不等于0, 需要加上num中i之后的元素.
    去除掉开头的零,同时保证在全是零的情况下返回一个0;

    class Solution {
    public:
        string removeKdigits(string num, int k) {
            std::vector<int> data;
            std::string result="";
            int number=0;    
            //if(num.size()<=0){
            //    return 0;
            // }
            for(int i=0;i<num.length();i++){
                number=num[i]-'0';
                //注意while的几个条件顺序不能换,否则出错
                while(data.size()!=0 && data[data.size()-1]>number && k>0){
                    data.pop_back();                k--;
                }
                if(number!=0 || data.size()!=0){
                    data.push_back(number);
                }
            }
            while(k>0 && data.size()!=0){
                data.pop_back();
                k--;            
            }
            for(int j=0;j<data.size();j++){
                result.append(1,data[j]+'0');
            }
            if(result==""){
                result="0";
            }
            return result; 
        }
    };
    

    通过更改while()循环体顺序出现错误信息如下:

    while( data[data.size()-1]>number && data.size()!=0 && k>0) //error
    

    错误消息:Line 923: Char 34: runtime error: pointer index expression with base 0x000000000000 overflowed to 0xfffffffffffffffc (stl_vector.h)

    所以切记正确的循环体顺序为:

     while(data.size()!=0 && data[data.size()-1]>number && k>0)
    

    再贴出一个参考代码

    算法思想都相同,实现方法不同:

    class Solution {
    public:
        string removeKdigits(string num, int k) {
            stack<char> st;
    /*	for(int i=0;i<num.length();i++) */
            for (auto c : num) {
                while (!st.empty() && st.top() > c && k > 0) {
                    st.pop();// 循环体中顺序不能换,导致错误
                    --k;
                }
                if (st.empty() && c == '0') continue;
                st.push(c);
            }
            while (!st.empty() && k > 0) {
                st.pop();
                --k;
            }
            string res;
            while (!st.empty()) {
                res += st.top();
                st.pop();
            }
            reverse(res.begin(), res.end());
            return res.empty() ? "0" : res;
        }
    };
    
  • 相关阅读:
    CI登录验证
    兼容所有浏览器的JS动态显示当前日期时间
    Active Record 数据库模式-增删改查操作
    数据库链接的增操作举例
    CI框架获取post和get参数 CodeIgniter
    PHP日期操作类代码-农历-阳历转换、闰年、计算天数等
    根据两点间的经纬度计算距离
    Session 类
    mysql 查询优化规则
    php获取文件夹下面的文件列表和文件夹列表
  • 原文地址:https://www.cnblogs.com/Tavi/p/12514054.html
Copyright © 2011-2022 走看看