为什么在这个python函数中WHILE比FOR更有效
主题:给定一个字符串,查找最长子字符串的长度,不重复字符。 代码:为什么在这个python函数中WHILE比FOR更有效,python,Python,主题:给定一个字符串,查找最长子字符串的长度,不重复字符。 代码: import time import string import random class Solution: def getRandomStr(self,length): s = "" for x in range(0,length): s += random.choice(string.ascii_letters+string.digi
import time
import string
import random
class Solution:
def getRandomStr(self,length):
s = ""
for x in range(0,length):
s += random.choice(string.ascii_letters+string.digits)
return s
# O(n)
def hasValue(self,s,v,p,r):
for k in range(p,r+1):
if s[k] == v:
return True
return False
# O(n^3)
# if s[j] is found in prestr ,
def lengthOfLongestSubstringWhile(self,s):
maxlen = 0
i = 0
j = 0
exitsign = False
t0 = time.clock()
while i < len(s):
j = i+1
while j < len(s):
if self.hasValue(s,s[j],i,j-1):
maxlen = max(maxlen,j-i)
break
elif j == len(s)-1:
maxlen = max(maxlen,j-i+1)
exitsign = True
break
j+=1
if exitsign:
break
i+=1
# print maxlen
def lengthOfLongestSubstringFor(self,s):
maxlen = 0
exitsign = False
for i in range(0,len(s)):
for j in range(i+1,len(s)):
if self.hasValue(s,s[j],i,j-1):
maxlen = max(maxlen,j-i)
break
elif j == len(s)-1:
maxlen = max(maxlen,j-i+1)
exitsign = True
break
if exitsign:
break
# print maxlen
S = Solution()
s = S.getRandomStr(10000)
t0 = time.clock()
S.lengthOfLongestSubstringWhile(s)
t1 = time.clock()
S.lengthOfLongestSubstringFor(s)
t2 = time.clock()
print t1-t0,t2-t1
导入时间
导入字符串
随机输入
类解决方案:
def getRandomStr(自身,长度):
s=“”
对于范围内的x(0,长度):
s+=random.choice(string.ascii_字母+string.digits)
返回s
#O(n)
def值(自身、s、v、p、r):
对于范围内的k(p,r+1):
如果s[k]==v:
返回真值
返回错误
#O(n^3)
#如果在prestr中找到s[j],
def lengthOfLongestSubstringWhile(自身):
maxlen=0
i=0
j=0
exitsign=False
t0=时间。时钟()
而我
结果是:
0.187118
0.868182
在1.2秒内完成
为什么使用
while
的函数比使用for
的函数更快?首先,range
在“for”版本中生成并丢弃了大量数字数组作为循环索引。比如,10000个数组,平均每个数组有5000个项目。尝试将range
替换为xrange
(生成器版本),这样做的次数不会太多。一方面,range
正在生成并丢弃大量的数字数组作为“For”版本中的循环索引。比如,10000个数组,平均每个数组有5000个项目。尝试将range
替换为xrange
(生成器版本),这样做不会太多。这不是非常惯用的Python,我想您的第一种语言是类似C的。例如,我们不是为范围(0,len)中的i编写,
而是为枚举中的i编写,
您是对的。本周一我开始使用Python:)这不是很地道的Python,我想你的第一语言是C语言。例如,我们不是为范围(0,len)中的i编写,
而是为枚举中的i编写,
您是对的。本周一我开始使用Python:)我按照你说的做了,它已经修好了。非常感谢!如果你能“接受”我的答案,那就太好了:)这是我第一次使用stackoverflow。那我怎么能接受呢?我按照你说的做了,它已经修好了。非常感谢!如果你能“接受”我的答案那就太好了:)这是我第一次使用stackoverflow。那么我怎么能接受呢?