leetcode-402-remove k digits-移掉k位数字

 

 

 

给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。

注意:

    num 的长度小于 10002 且 ≥ k。
    num 不会包含任何前导零。

示例 1 :

输入: num = "1432219", k = 3
输出: "1219"
解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。

示例 2 :

输入: num = "10200", k = 1
输出: "200"
解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。

示例 3 :

输入: num = "10", k = 2
输出: "0"
解释: 从原数字移除所有的数字,剩余为空就是0。

题目要求:移掉k个数字,使得剩下的数字最小;本质是局部重复性的变化问题,每次在可选范围内移掉一个数字,每移掉一个最小数字;如此往复。

题目本质:贪心问题,明确局部问题,每次做出局部最优解;开始index,遍历长度,最小值,最小值所在的index,遍历边界;

应用:贪心问题,重复性处理的问题,局部方法一样,条件有变化的如此处理。

问题:开始为0的处理,处理一批情况。每次局部处理可选的范围大小。

 

 

 

package com.jd.jr.nlp;

import java.util.ArrayList;
import java.util.List;

/**
 *   while遍历,确定可选范围 内的最小数,
 *   之后根据最小数下移,如此往复
 *
 *
 */

public class Solution402Diy {
    public String removeKdigits(String num, int k) {
        if(k==0){
            return num;
        }
        if(num.length()==k){
            return "0";
        }
        int[] digits=new int[num.length()];
        for(int i=0;i<num.length();i++){
            digits[i]=Integer.valueOf(num.substring(i,i+1));
        }
        List<Integer> minDigits=new ArrayList<>();
//        int differNum=num.length()-k+1;
        int differNum=k+1;
        int i=0;
        int s=0;
        int minNumValue=Integer.MAX_VALUE;
        int minNumPosition=-1;
        while (true){
            if(minDigits.size()==num.length()-k){
                break;
            }
            if(i-s<differNum) {
                if (digits[i] < minNumValue) {
                    minNumPosition = i;
                    minNumValue = digits[i];
                }
            }else {
                minDigits.add(minNumValue);
                s=minNumPosition+1;
                i=minNumPosition;
                minNumValue=Integer.MAX_VALUE;
                minNumPosition=-1;
//                differNum=num.length()-s-minDigits.size()+1-(num.length()-k-minDigits.size());
                differNum=num.length()-s-(num.length()-k-minDigits.size()-1);
            }
            i++;

        }
        StringBuilder sb=new StringBuilder();
        for(i=0;i<minDigits.size();i++){
            if(i==0 &&  minDigits.size()==1 && minDigits.get(i)==0){
                return "0";
            }else if(sb.length()==0  && minDigits.get(i)==0){
                continue;
            }
            sb.append(minDigits.get(i));
        }
        return sb.length()==0? "0": sb.toString();
    }

    public static void main(String[] args){
        Solution402Diy solution402Diy=new Solution402Diy();
        String num = "1432219";
        int k = 3;

//        num = "10200";
//        k = 1;

//        num = "10";
//        k = 2;

//        num="10";
//        k=1;

//        num="0";
//        k=0;

//        num="1107";
//        k=1;

        String resultLeft=solution402Diy.removeKdigits(num,k);
        System.out.println("===============resultLeft===============");
        System.out.println(resultLeft);

    }


}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值