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日

相关推荐

  • leetcode707-设计链表

    原题 设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用…

    算法 2019年12月14日
    0290
  • leetcode39-组合总和

    原题 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates …

    2020年5月1日
    02920
  • leetcode86-分隔链表

    原题 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点的初始相对位置。 示例: 输入: head…

    算法 2020年4月27日
    0160
  • leetcode74-搜索二维矩阵

    原题 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性: 每行中的整数从左到右按升序排列。 每行的第一个整数大于前一行的最后一个整数。   示例…

    算法 2020年4月29日
    0210
  • 程序员面试金典17.16-按摩师

    原题(来源Leetcode) 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,…

    算法 2020年3月24日
    01000
  • leetcode705-设计哈希集合

    原题 不使用任何内建的哈希表库设计一个哈希集合 具体地说,你的设计应该包含以下的功能 add(value):向哈希集合中插入一个值。 contains(value) :返回哈希集合…

    算法 2019年12月18日
    0140
  • leetcode84-柱状图中最大的矩形

    原题 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 以上是柱状图的示例,其中每个柱子的宽…

    2020年1月24日
    0130
  • leetcode344-反转字符串

    原题 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组char[]的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间…

    算法 2019年11月18日
    0150
  • leetcode72-编辑距离

    原题 给你两个单词 word1 和 word2 ,请你计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字…

    2020年4月6日
    0140
  • leetcode21-合并两个有序链表

    原题 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入: 1->2->4, 1->3->4 输出: 1->1->2->3-…

    2019年12月17日
    0100

发表回复

登录后才能评论