算法学习记录——删去k个数字后的最小值(JAVA实现)

 算法学习记录——删去k个数字后的最小值

//问题:一个整数,删除K个数字后的最小值问题
//用栈--这种逻辑存储方式解决问题
//1、这个整数用字符串进行存储,方便操作——其实跟数组一样,只是为了操作上方便一些。
//2、创建一个跟原整数位数一样多的字符数组stack——当作栈来使用,遵循后进先出原则。
/*3、算法关键——栈顶的元素stack[top-1]跟整数(字符串nums[i])当前位 的字符c比较大小,进行是否入栈的操作:
 * 对整个整数从左往右找,如果高位nums[i]>nums[i+1],那就删除nums[i]这一位数。
 */
//4、删除k个数后,从左往右,再删除高位为0的数字——用offset记录0的数量。


public class RemoveKDigits {

	public static String removeKDigits(String nums, int k) {
		
		//记录删除k个数后,剩余数字的位数。
		int newnumlength=nums.length()-k;
		
		//创建一个栈——数组stack,用来记录当前删除后的整数。
		char[] stack=new char[nums.length()];
		
		//当作栈顶来用
		int top=0;
		
		//核心算法实现
		for(int i=0;i<nums.length();i++) {
			//存储当前i位的数字
			char c=nums.charAt(i);
			//判断当前栈顶元素是否大于c,即是否为要删除的数字,如果是,top-1,k-1
			while(top>0 && stack[top-1]>c && k>0) {
				top=top-1;//出栈
				k=k-1;	
			}
			//存储当前位c——入栈
			stack[top]=c;
			top=top+1;
		}
		
		//判断剩余数字中,左侧高位是否有0,并用offset记录0的数量
		int offset=0;
		while(offset<newnumlength && stack[offset]=='0') {
			offset++;
		}
		
		//三元运算符返回结果
		return offset==newnumlength?"0":new String(stack , offset, newnumlength-offset);
	}
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(removeKDigits("1593212",3));
		System.out.println(removeKDigits("30200",1));
		System.out.println(removeKDigits("10",2));
		System.out.println(removeKDigits("541270936",3));
	}

}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值