写代码的第七天
344.反转字符串
思路
设置双指针,一个从头一个从尾开始,将首尾字符交换位置。不要申请新的内存空间。
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
i = 0
j = len(s) - 1
while i < j:
temp = s[i]
s[i] = s[j]
s[j] = temp
i += 1
j -= 1
return s
541. 反转字符串II
思路
设置快慢指针,快指针先走2k个,慢指针在0位,采用上面的反转字符串方法,对(0-k)个字符进行反转;然后慢指针移动到快指针的下一位,快指针继续向前走2k个,如果快指针走不到2k个就证明已经到了最后的位置,那么这个时候分析快指针究竟走了小于k步还是在k-2k之间,如果小于k步,那么直接反转,如果在k-2k之间,那么反转前k个。
错误第一版:
class Solution:
def reverseStr(self, s: str, k: int) -> str:
n = len(s) // (2*k)
m = len(s) % (2*k)
resultstrs = list(s)
while n:
strran = s[(n-1)*2*k:(n-1)*2*k+2*k]
newstrs = self.reverse(strran[(n-1)*2*k:(n-1)*2*k+k])
resultstrs[(n-1)*2*k:(n-1)*2*k+2*k] = newstrs + strran[(n-1)*2*k+k:(n-1)*2*k+2*k]
n -= 1
mstr = s[n*2*k:]
if m > k and m < 2*k:
newstrs = self.reverse(mstr[n*2*k:n*2*k+k])
resultstrs[n*2*k:] = newstrs + mstr[n*2*k+k:]
if m <= k:
resultstrs[n*2*k:] = self.reverse(mstr)
return s
def reverse(self,strs):
strs = list(strs)
i = 0
j = len(strs) - 1
while i < j:
strs[i],strs[j] = strs[j],strs[i]
i += 1
j -= 1
return ''.join(strs)
之前的思路是设置快慢指针,但是发现我们不需要知道快指针每次走过的字符,只需要知道他出现在慢指针+2k的位置上,所以其实用一个指针,每次步长位2k就行。
卡码网:54.替换数字
思路(相当暴力)
循环字符串,遇到数字就替换成number。
解决问题1:字符串是不能被修改替换的,所以第一步要将字符串变为list。
解决问题2:最后要的结果是字符串,但是实际上是个list所以要用这个语法把字符串转换为list。return ‘’.join(s)
正确代码:
def tihuan(strs):
s = list(strs)
for i in range(len(s)):
if s[i] == '0' or s[i] == '1' or s[i] == '2' or s[i] == '3' or s[i] == '4' or s[i] == '5' or s[i] == '6' or s[i] == '7' or s[i] == '8' or s[i] == '9':
s[i] = 'number'
return ''.join(s)
str1 = input()
result = tihuan(str1)
print(result)
我也是没想到就因为‘ ’这个分号里面多了个空格我找个半小时,阿西吧我真无语啊。。。。
思路2(可能不用辅助空间)
对字符串进行扩展,将字符串的长度扩展为把数字替换成number之后的数组长度。然后建立双指针,从后向前移动一个指针,在对应的位置插入number,前面的指针也是对原始数组进行从后向前移动遍历。
解决问题1:python中字符串是不允许被改变的,所以要用这个方法其实首先还是要把字符串变成list。
解决问题2:两个指针的位置在哪里?我们需要这两个指针做的事情是将原始数组从最后一位开始移动,如果这个最后一位是数字那么就将numbers放入到最后吗,如果最后一位不是数字那么久将这个数字移动到最后的位置,所以我们需要两个指针分别放在原始数组的最后一位和新数组的最后一位,然后向前遍历。
解决问题3:数组究竟要变成多长的?首先要对原始数组进行遍历,对数字的出现次数进行计数,然后将数组变成(len(原始数组)-count+6*count)的长度。但是应该怎么写呢?python中可以使用extend对数组长度进行变化,s.extend([None] * (count * 5)),但是需要注意一个问题,如果你写的句子是newlist=s.extend([None] * (count * 5)),这种写法是错误的,因为extend是直接修改原数组的,并且返回值是None。
正确代码:
def tihuan(strs):
slist = list(strs)
s = list(strs)
count = 0
for i in range(len(s)):
if s[i] in ['1','2','3','4','5','6','7','8','9','0']:
count += 1
s.extend([None] * (count * 5))
m = len(slist) - 1
n = len(s) - 1
while m >= 0 and n >= 0:
if s[m] in ['1','2','3','4','5','6','7','8','9','0']:
s[n-5:n+1] = ['n','u','m','b','e','r']
n -= 6
m -= 1
else:
s[n] = s[m]
m -= 1
n -= 1
return ''.join(s)
str1 = input()
result = tihuan(str1)
print(result)
解决问题4:看了卡哥的讲解,说了要将number倒着插入,我看了一下卡哥c++的代码,倒着写的原因是在他的代码中s[n] = 'r’s[n-1] = 'e’s[n-2] = 'b’s[n-3] = 'm’s[n-4] = 'u’s[n-5] = 'n’这些地方的索引部分都是n–得到的,但是python中没有n–这种操作,只能是n-=1,这个式子不能作为索引出现,所以如果非要按照倒着插入只能向下面这么写,但是吧没意义,和上面一样。
正确代码:
def tihuan(strs):
slist = list(strs)
s = list(strs)
count = 0
for i in range(len(s)):
if s[i] in ['1','2','3','4','5','6','7','8','9','0']:
count += 1
s.extend([None] * (count * 5))
m = len(slist) - 1
n = len(s) - 1
while m >= 0 and n >= 0:
if s[m] in ['1','2','3','4','5','6','7','8','9','0']:
s[n] = 'r'
s[n-1] = 'e'
s[n-2] = 'b'
s[n-3] = 'm'
s[n-4] = 'u'
s[n-5] = 'n'
n -= 6
m -= 1
else:
s[n] = s[m]
m -= 1
n -= 1
return ''.join(s)
str1 = input()
result = tihuan(str1)
print(result)
总结
1、python中可以使用extend对数组长度进行变化,s.extend([None] * (count * 5)),但是需要注意一个问题,如果你写的句子是newlist=s.extend([None] * (count * 5)),这种写法是错误的,因为extend是直接修改原数组的,并且返回值是None。
2、list转换为字符串:return ‘’.join(s)
2、细致一点。。。。