代码随想录第八条:344.反转字符串、541. 反转字符串II、替换数字

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)
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值