2021.05.04移掉k个数字求最小数字

本文介绍了一种解决LeetCode上移除k个数字求最小数字问题的方法,通过转换问题视角,将其转化为选取len-k个数字的问题,并采用贪心策略,选取高位上的最小数字,最终实现去除前导零并返回最小可能数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2021.05.04移掉k个数字求最小数字

( 题目来源:https://leetcode-cn.com/problems/remove-k-digits/ )

题目描述

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

数据规模和约定

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

思路

其实这是一道贪心题,但还是根据之前的笔记记录:

  1. 将“移除k个数字”转换成“选取 len-k个数字”。
  2. 先选位数高的。
  3. 每次选数字的区间有一定的限制:
    假设在长度为N的数字中选取K个数字
    (1)第一次选择:
    在这里插入图片描述

(2)之后选择:
在这里插入图片描述

还需要写代码去除前导0.

代码

	public String removeKdigits(String num, int k) {
		if(num.length() == k) return "0";
		String res = helper(num,num.length()-k);
        //System.out.println(res);
		StringBuffer sb = new StringBuffer();
		boolean isHead = true;
		for(int i = 0; i < res.length(); i++) {
			if(res.charAt(i) == '0' && isHead == true) {
				continue;
			} else {
				isHead = false;
				sb.append(res.charAt(i));
			}
		}
		return sb.length()==0? "0": sb.toString();
	}
	public String helper(String num, int k) {
		String res = "";
		int left = 0;
		int right = num.length()-k+1;
		for(int z = 0; z < k; z++) { //取k次
			char min = num.charAt(left);
			left++;
			for(int i = left; i < right; i++) {
				if(num.charAt(i) < min) {
					min = num.charAt(i);
					left = i+1;
				}
			}
			right++;
			res = res+min;
		}
		return res;
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值