处理一个作业问题,要求输入0到9之间的任何给定整数字符串,并将其拆分为升序列表。例如,给定一个整数字符串,例如'455666777788888999999'
,我希望它返回[4, 5, 56, 66, 77, 778, 888, 899, 999]
,或者给定一个整数字符串,例如'045349'
,我希望它返回一个列表,例如{{1 }}。下一个整数仅必须严格大于前一个整数。任何不足够大而不能继续添加到不断增长的整数列表中的整数,都应该丢弃。
我知道通过列表理解,我可以将字符串转换为整数列表,其内容如下:[0, 4, 5, 34]
,但这会将字符串中的每个元素分解为列表中的单个元素。任何帮助将不胜感激。
答案 0 :(得分:2)
这是一种减少/累加操作,因此列表组合并不十分合适。
这是一个幼稚的算法:保持运行中的数字累加器。每当当前总数大于结果列表的末尾或结果列表为空时,将累加器附加到结果列表中并清空累加器。
digits = "455666777788888999999"
res = []
accum = ""
for e in digits:
accum += e
if not res or int(accum) > res[-1]:
res.append(int(accum))
accum = ""
print(res) # => [4, 5, 56, 66, 77, 778, 888, 899, 999]
答案 1 :(得分:0)
我想到的第一件事就是使用递归。构造一个辅助函数,该函数需要与最小值进行比较,要拆分的字符串和结果数组。从头开始读取字符串,直到找到一个大于最小值的值,然后将此数字作为最小值传递,并将不包含该数字的字符串传递给下一个递归调用。或者,您可以将字符串保持静态,然后传递您所在的索引。
代码类似于:
void helper(minimum, int_string, result_arr):
for i in range(1, len(int_string)):
num = int(string[0:i])
if num > minimum:
result_arr.append(num)
helper(num, string[i:], result_arr)
您可能要根据给定的问题处理一些极端情况,例如字符串的最后一位小于倒数第二个数字,或者给定的字符串为空。
答案 2 :(得分:0)
您可以尝试这个。
def asc_split(s):
r = [int(s[0])]
s=s[1:]
while int(s)>r[-1]:
i=1
while int(s[:i])<=r[-1]:i+=1
r+=[int(s[:i])]
s=s[i:]
return r