LintCode 182-删除数字

本人电子系,只为一学生。心喜计算机,小编以怡情。

给出一个字符串 A, 表示一个 n 位正整数, 删除其中 k 位数字, 使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数。
找到删除 k 个数字之后的最小正整数。
N <= 240, k <= N

样例:
给出一个字符串代表的正整数 A 和一个整数 k, 其中 A = 178542, k = 4

返回一个字符串 “12”


经验:Stack里放StringBuffer,StringBuffer改变,那么Static也会变化。

也就是说,Stack里不能存放可变的变量,因为可变的变量发生变化,Stack也会发生变化,导致原本想要保存当前值,最后保存不了。


思路:贪心法赛高!

public String DeleteDigits(String A, int k) {
        // write your code here
        if(A.length()==0)return "0";

        StringBuffer a=new StringBuffer(A);
        Stack<StringBuffer> linshi=new Stack<>();//用栈来保存删改前的数据

        for(int i=0;i<k;i++)
        {
            StringBuffer min=new StringBuffer(a.substring(0, a.length()-1));//将min赋一个值,随便就好,我这里用0~length-1
            for(int j=0;j<a.length();j++)
            {
                linshi.push(new StringBuffer(a));//记住一定要new一个,否则a改变这里也会改变
                StringBuffer temp=a.deleteCharAt(j);//贪心法,删一个试一试

                min=min.toString().compareTo(temp.toString())<0?min:temp;//和原先相比谁大谁小
                a=linshi.pop();//再将a变成修改前的数据
            }
            a=min;//找到最小后将其赋给a,表明删除一个元素后的最小值
            //继续循环
        }
        int i=0;
        for(;a.charAt(i)=='0';i++);//消除零,比如023就是23
        return a.toString().substring(i, a.length());

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值