leetcode402-移掉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. 注意输出不能有任何前导零。789

示例 3 :

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

解法

思想

要在一个长度为length的字符数组中去掉k位,留下一个最小数字,则是要留下一个length-k位的数字,我们每一次都要保证在剩余位数充足的情况下选择最小的数字。

对于示例一,"1432219"要选出7-3=4位数字,我们可以保留最后三位,在前五位中选出一个最小数字1,然后在剩下的"432219"中选出3位数字,我们可以保留最后两位,在前四位中选出一个最小数字2,然后在剩下的"219"中选出2位数字,我们可以保留最后一位,在前两位中选出一个最小数字1,然后在剩下的"9"中选出1位数字,选取9。

得到的结果就是"1219"

代码

class Solution {
    public String removeKdigits(String num, int k) {
        char[] nums = num.toCharArray();
        int start = 0;//下一次选取数字开始的位置
        int min = 0;
        int origink = k;
        char[] result = new char[nums.length-k];//保存结果

        while(k<nums.length){
            for(int i = start;i<k+1;i++){//保留有限位数,选取最小数字
                if(nums[i]<nums[min]){
                    min = i;
                }
            }
            result[k-origink] = nums[min];
            k++;
            start = min+1;
            min = start;
        }
        for(int i = 0;i<=result.length;i++){//去除开头的0
            if(i==result.length)
                return "0";
            if(result[i]!='0'){
                result = Arrays.copyOfRange(result,i,result.length);
                break;
            }
        }

        return String.valueOf(result);
    }
}

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/leetcode402-%e7%a7%bb%e6%8e%89k%e4%bd%8d%e6%95%b0%e5%ad%97/

(0)
彭晨涛彭晨涛管理者
上一篇 2020年1月28日
下一篇 2020年1月29日

相关推荐

  • leetcode108-将有序数组转换为二叉搜索树

    原题 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 示例: 给定有序数…

    算法 2020年1月18日
    090
  • leetcode540-有序数组中的单一元素

    原题 给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。 示例1: 输入: [1,1,2,3,3,4,4,8,8] 输出: 2 示例2: 输入…

    2020年2月25日
    0700
  • leetcode146-LRU缓存机制

    原题 运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。 获取数据 get(key) -…

    算法 2020年5月25日
    0100
  • leetcode162-寻找峰值

    原题 峰值元素是指其值大于左右相邻值的元素。 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。 数组可能包含多个峰值,在这种情况…

    算法 2020年1月3日
    060
  • leetcode76-最小覆盖子串

    原题 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输…

    算法 2020年5月23日
    0170
  • leetcode20-有效的括号

    原题 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序…

    算法 2019年12月11日
    0210
  • 剑指offer51-数组中的逆序对

    原题(来源Leetcode) 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 示例 1: 输入: [7…

    算法 2020年4月24日
    0400
  • leetcode106-从中序与后序遍历序列构造二叉树

    原题 根据一棵树的中序遍历与后序遍历构造二叉树。 注意:你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postor…

    算法 2020年1月13日
    0380
  • leetcode236-二叉树的最近公共祖先

    原题 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 …

    2020年1月15日
    070
  • leetcode561-数组拆分I

    原题 给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从1 到 n 的 min(ai, b…

    算法 2019年11月18日
    090

发表回复

登录后才能评论