我已经在Udemy上学过CS课程,并得到了一个测验来解决。
这里是说什么:
定义一个过程find_last,它将两个字符串作为输入,a 搜索字符串和目标字符串,并返回最后一个位置 出现目标字符串的搜索字符串,如果有,则返回-1 没有出现。
示例:
find_last('aaaa', 'a')
返回3
第一个解决方案是我的,最后一个解决方案是他们的。我的问题是,他们在哪些方面比我的更好,我怎么能在下次解决这类问题时思考,所以我会更快更好地找到解决方案。 (我花了至少45分钟考虑解决方案)。
def find_last(s, t):
some = s.find(t)
i = some
while s.find(t, i) != -1:
some=s.find(t, i)
i=i+1
return some
def find_last(s,t):
last_pos = -1
while True:
pos = s.find(t, last_pos+1)
if pos==-1:
return last_pos
last_pos = pos
以下是示例:
print find_last('aaaa', 'a') # returns 3
print find_last('aaaaa', 'aa') # returns 3
print find_last('aaaa', 'b') # returns -1
print find_last("111111111", "1") # returns 8
print find_last("222222222", "") # returns 9
print find_last("", "3") # returns -1
print find_last("", "") # returns 0
答案 0 :(得分:4)
无需编写任何代码,只需使用python内置字符串"右键查找":
print('aaaa'.rfind('a'))
结果:3
print('bbbbb'.rfind('a'))
结果:-1
也适用于"超过1-char"当然搜索字符串
print('bbbxb'.rfind('bx'))
结果:2
当然,在Linux或Windows等大多数普及平台上,处理都是原生的:意味着你无法超越速度。
编辑:有人建议您在一行中对find_last
进行编码。非常好:
find_last = lambda x,y: x.rfind(y)
答案 1 :(得分:1)
我认为课程的主要思想是学习算法,这个练习最好开始(无论解决方案是否是解决此类问题的最有效方法当前的编程语言)。所以,他们的解决方案更好,因为他们跳跃'在迭代过程中,在找到第一次出现t
的索引后,您逐步执行1。我将尝试用简单的例子来解释:
您有一个字符串s = 'abbbabbba'
,您需要找到'a'
。当您使用您的功能时,请将其设为fun_last_1(s, 'a')
:
def find_last_1(s, t):
some = s.find(t) # some = 0
i = some # i = 0
while s.find(t, i) != -1: # ok
some=s.find(t, i) # you again start from 0 (some = 0) ???
i=i+1 # and from here you steps by 1
# put print(i) in this row
return some # in total you will have 9 iterations
在这种情况下,您将需要9次迭代才能获得最终结果。虽然它们只需要4,但我们在它们的循环中添加一个print语句:
def find_last_2(s,t):
last_pos = -1
while True:
pos = s.find(t, last_pos+1)
print(pos) # add print here
if pos==-1:
return last_pos
last_pos = pos # here they jumps
>>> find_last_2(s,'a')
0
4
8
-1
# and of course it will return 8
您还可以在函数的循环中添加此调试print()
并进行比较:
>>> find_last_1(s, 'a')
1
2
3
4
5
6
7
8
9
# and of course it will return 8
希望这有助于您了解其中的差异。