删除k个数字后的最小值

问题描述:

给出一个整数,从该整数中去掉K个数字,要求剩下的数字形成的新整数尽可能小。

问题分解:转化为先去掉一个数字问题。删除的不仅仅是最大的数字,而且是删除高位的数字。

如何把高位的数字降低呢?
把原整数的所有数字从左到右进行比较,如果发现某一位数字大于它右边的数字,那么删除该数字,因为右面的大数字顶替小数字位置,新整数值变小。

def remove_k_digits(num, k):
	for i in range(0, k):
		has_cut = False
		# 从左向右遍历,找到比自己右侧数字大的数字并删除
		for j in range(0, len(num) - 1):
			if num[j] > num[j + 1]:
				num = num[0:j] + num[j+1: len(num)]
				has_cut = True
				break
		# 如果没有找到删除的数字,则删除最后一个数
		if not has_cut:
			num = num[0:len(num) - 1]

	# 清除整数左侧的0
	for j in range(0, len(num) - 1):
		if num[i] != '0':
			break
		num = num[1: len(num)]
	# 如果数字都被删除了,则返回0
	if len(num) == 0:
		return "0"

	return num

print(remove_k_digits2("541270936",3)) # 120936

提高新方法 :
利于栈,在遍历原整数的同时,让所有数字在一个一个入栈,当某个数字需要被删除时候,让该数字出栈。循环结束后,把栈中元素转换为字符串类型的结果。

遇到0,并且栈为空,不入栈

“”.join(stack)

def remove_k_digits2(num, k):
	# 删除k数字后的长度,也即是新数的长度
	ans_length = len(num) - k
	# 创建一个栈,用于接收所有的数字
	stack = []
	for i in range(0, len(num)):
		# 遍历当前数字
		c = num[i]
		# 当前栈顶数字大于遍历到的当前数字时,栈顶数字出栈,相当于删除数字
		while len(stack) > 0 and stack[len(stack) - 1] > c and k > 0:
			stack.pop()
			k -= 1
			# 如遇到数字0 ,且栈为空,0不入栈
			if '0' == c and len(stack) == 0:
				ans_length -= 1
				if ans_length <= 0:
					return "0"
				continue
		# 遍历到的当前数字入栈
		stack.append(c)
	# 找到栈中第一个非零数字的位置,以此构建新的整数字符串
	if ans_length <= 0:
		return "0"

	print(stack)
	return "".join(stack[:ans_length])
print(remove_k_digits2("541270936",3))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值