将两种不同的解决方案与测验进行比较

时间:2016-09-12 20:10:29

标签: python algorithm

我已经在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

2 个答案:

答案 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

希望这有助于您了解其中的差异。