写代码的第八天
151.翻转字符串里的单词
思路(使用库函数)
错误版本一:newstr = list(’ '.join(s.split()))这句话最后输出的还是一个字符串,并不是想象中的切分单词后,每个单词list输出。
class Solution:
def reverseWords(self, s: str) -> str:
newstr = list(' '.join(s.split()))
left = 0
right = len(newstr) - 1
while left < right:
newstr[left],newstr[right] = newstr[right],newstr[left]
left += 1
right -= 1
return newstr
错误版本二:没变成字符串形式
class Solution:
def reverseWords(self, s: str) -> str:
newstr = s.split()
left = 0
right = len(newstr) - 1
while left < right:
newstr[left],newstr[right] = newstr[right],newstr[left]
left += 1
right -= 1
return newstr
正确代码:
class Solution:
def reverseWords(self, s: str) -> str:
newstr = s.split()
left = 0
right = len(newstr) - 1
while left < right:
newstr[left],newstr[right] = newstr[right],newstr[left]
left += 1
right -= 1
return ' '.join(newstr)
卡码网:55.右旋转字符串
思路
不要想着设置一个新字符串,然后切片再加入新字符串,那这个题就没意义了。
将字符分为两部分,一部分是后k个要移动的字符,一部分是剩下的字符,主要操作就是将所有字符整体翻转,然后再将剩下字符分别翻转,就可以得到效果了。
错误第一版:错误原因:存在数组越界。reverse函数中居然没有对i和j进行移动操作,啊啊啊啊啊啊我在想啥。
def reverse(s):
s = list(s)
i = 0
j = len(s) - 1
while i < j:
s[i],s[j] = s[j],s[i]
return s
def rightreverse(s,k):
s = reverse(s)
s1 = reverse(s[0:len(s)-k])
s2 = reverse(s[len(s)-k:])
return s1+s2
k = int(input())
s = input()
result = rightreverse(s,k)
print (''.join(result))
错误第二版:倒是翻转了,但是反转错啦,所以错误在s1 = reverse(s[0:len(s)-k])
s2 = reverse(s[len(s)-k:])这两句话上,原来是abcdefg,整体翻转之后是gfedcba,所以s1的范围应该是前k个,s2的范围应该是从k开始后面的数。。。。
def reverse(s):
s = list(s)
i = 0
j = len(s) - 1
while i < j:
s[i],s[j] = s[j],s[i]
i += 1
j -= 1
return s
def rightreverse(s,k):
s = reverse(s)
s1 = reverse(s[0:len(s)-k])
s2 = reverse(s[len(s)-k:])
return s1+s2
k = int(input())
s = input()
result = rightreverse(s,k)
print (''.join(result))
一定要注意在前面的函数中写的返回值都是list类型,最后要转换成str类型。
正确代码:
def reverse(s):
s = list(s)
i = 0
j = len(s) - 1
while i < j:
s[i],s[j] = s[j],s[i]
i += 1
j -= 1
return s
def rightreverse(s,k):
s = reverse(s)
s1 = reverse(s[0:k])
s2 = reverse(s[k:])
return s1+s2
k = int(input())
s = input()
result = rightreverse(s,k)
print (''.join(result))