我的python看起来工作时输入字符串的长度不是很大,但是很长的字符串失败了。这是问题陈述:
如果字符串S满足以下两个属性,则称为特殊字符串: S中的每个字符都是' 0' 0或者' 1'。 每当S = UV,其中U和V都是非空字符串时,U在字典顺序中严格小于V. 例如,字符串S =" 00101"很特别,因为我们有" 0" < " 0101"," 00" < " 101"," 001" < " 01"," 0010" < " 1&#34 ;. 您将获得一个保证特殊的字符串电流。设N是电流的长度。考虑长度为N的所有特殊字符串的按字典顺序排序的列表。计算并返回此列表中当前紧接的字符串。如果当前恰好是列表中的最后一个字符串,则返回一个空字符串。
这是我的python代码:
class SpecialStrings(object):
def findNext(self, current):
if current == '0':
return '1'
N = len(current)
iter_times = 2 ** N - int(current, 2) - 1
temp_current = current
for i in range(iter_times):
temp_s = self.get_next_string(temp_current)
if self.is_special(temp_s):
return temp_s
if temp_s[0] == '1':
return ''
temp_current = temp_s
return ''
def get_next_string(self, s):
next_string = bin(int(s, 2) + 1)
next_string = next_string[2:]
if len(next_string) < len(s):
temp_zero = '0' * (len(s) - len(next_string))
next_string = temp_zero + next_string
return next_string
def is_special(self, s):
for i in range(1, len(s)):
left = s[:i]
right = s[i:]
if left >= right:
return False
return True
我收到输入异常终止&#34; 0111111111111111111111111111&#34;和&#34; 001111111111111111111111111111111111111111&#34;。当我尝试用它们中的任何一个在本地测试时,我的计算机内存已经耗尽......
这里有什么问题?是因为我的算法效率不高吗?怎么解决?
非常感谢!!!!!
答案 0 :(得分:0)
你可能正在使用Python2。在Py2中,range()
(您的第8行)返回一个列表。例如。 range(3)
返回[0,1,2]。所以range(iter_times)
会创建一个耗尽内存的大型列表。简单的解决方法:改为使用xrange
。 Refer
但是使用xrange
,您很快就会收到另一个错误:
OverflowError:Python int太大而无法转换为C long
因为传递给xrange的参数不应超过max signed long。例如。在我的计算机xrange(0x7fffffff)
中没问题,而xrange(0x80000000)
可以触发错误。 Refer
解决方法:在第8行中,使用while True:
代替。因为如果代码按预期工作,那么循环应该在到达for循环结束之前返回结果或空字符串。所以不需要使用for循环。
下一个麻烦,当你使用'while True'时,输入'0111111111111111111111111111'应该可以正常工作,但'001111111111111111111111111111111111111111'将继续计算。这就是算法问题。你使用蛮力,预计大输入的计算时间长。您可能需要找到特殊字符串的模式来改进算法。