参考
《算法设计与分析》
问题描述
输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原来左右次序将组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。
输出应该包括所去掉的数字的位置和组成的新的正整数(N不超过240位)。
数据结构设计:高精度正整数的运算应存储为字符串格式。
问题分析
在位数固定的前提下,让高位的数字尽量小,其值就较小。依据此贪婪策略就可以解决这个问题。
如何根据贪婪策略删除数字呢?总目标是删除高位较大的数字,具体地相邻两位比较,若高位比低位大则删除高位。
代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
def getMin(N, S):
'''
Function to get the min val after we remove S numbers from N.
Example:
>>> getMin('12435863', 3)
'12353'
>>> getMin('231183', 3)
'113'
>>> getMin('1234567', 3)
'1234'
>>> getMin('120083', 3)
'3'
>>> getMin('120083', 4)
'0'
'''
src_len = len(N)
dst_len = src_len - S
for cnt in range(0, S):
for i in range(1, len(N)):
if N[i-1] > N[i]:
N = N[:i-1] + N[i:]
break
if len(N) != dst_len:
N = N[:dst_len-len(N)]
while N[0] == '0' and len(N) != 1:
N = N[1:]
return N
if __name__ == '__main__':
import doctest
doctest.testmod()