day8,2h,落下一天之后,每天都在赶进度......
344.反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
#双指针法
class Solution(object):
def reverseString(self, s):
left = 0
right = len(s)-1
while right > left:
s[left], s[right] = s[right], s[left]
left += 1
right -=1
#range直接循环法
class Solution(object):
def reverseString(self, s):
n = len(s)
for i in range(n // 2):
s[i], s[n - i - 1] = s[n - i - 1], s[i]
541. 反转字符串II
给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
自己写
用下标遍历数组,用一个变量n存储现在是第几组k个元素(n%2可以表示是否反转),当数组下标满足某个要求、n也满足要求的时候,翻转这段数组
class Solution(object):
def reverseStr(self, s, k):
n = 1
sl = list(s)
for i in range(len(sl)):
if i%k == (k-1) and n%2 ==1:
start = k * (n-1)
for j in range(k//2):
sl[start + j], sl[i-j] = sl[i-j], sl[start + j]
n += 1
elif i%k == (k-1) and n%2 ==0:
n += 1
#处理末尾
if n%2 ==0:
return ''.join(sl)
else:
start = k * (n-1)
for j in range((len(sl)-start)//2):
sl[start + j], sl[len(sl)-1-j] = sl[len(s)-1-j], sl[start + j]
return ''.join(sl)
能通过,但是时间有点长,参考题解进行一些修改
首先,并不需要一步步地遍历,既然给出了k,那么可以以k为步长遍历;但是如果以k为步长,那么会导致还是需要上文的n来控制是否翻转,有点麻烦,索性以2k为步长,然后翻转前k个元素。
class Solution(object):
def reverseStr(self, s, k):
def reverse_substring(text):
left, right = 0, len(text) - 1
while left < right:
text[left], text[right] = text[right], text[left]
left += 1
right -= 1
return text
res = list(s)
for cur in range(0, len(s), 2 * k):
res[cur: cur + k] = reverse_substring(res[cur: cur + k])
return ''.join(res)
而且这里涉及到了python字符串切片的一个特性,切片的索引可以超出字符串或数组最大索引值,编译器不会报错,会返回至字符串最后一个值。
切片索引越界是合理的,但如果索引范围内没有合法内容,会返回对应类型的空值。
切片越界是合法的,但是直接使用索引查找不合法,如len(a)=2,a【5】是不合法的,a【0:5】是合法的。
详细机制在这里有介绍Python的切片机制:解析为何不会索引越界_python切片不会越界-CSDN博客
替换数字
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。
例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
使用python写比较简单,只需要新建一个字符串来存储result就ok(实际上跟所谓双指针是一样的思路,只是双指针是原地更新,新建字符串是另开一个更新)
也可以把字符串转化为数组后,把数组里的数字更新为“number”然后再合并字符串。为什么要转化数组?因为python中的字符串是不可变的类型,一旦创建,就无法在原地进行修改,如果修改了其内容(切片、修改等)实际上在内存中的地址就已经改变了
s = input()
result = ''
for i in s:
if ord(i) >= ord("a") and ord(i) <= ord('z'):
result = result + i
else:
result = result + "number"
print(result)