首页 > 其他分享 >Day8 字符串part1

Day8 字符串part1

时间:2024-07-24 13:07:11浏览次数:8  
标签:end Day8 start 修改 part1 lst 字符串 size

任务

344. 反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

思路

这道题比较简单,只需用双指针法交换头尾的值,然后往中间缩进即可。注意的是这里python给提供的函数时字符列表,因为字符串本身是不可变对象,无法修改其中的元素。

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        size = len(s)
        for i in range (0,size//2):
            tmp = s[i]
            s[i] = s[size-1-i]
            s[size-1-i] = tmp

541. 反转字符串 II

思路

模拟题,按照2k的步数遍历,如果还剩多于k个数,则反转k个。少于k个,则反转最后的剩余的数字。注意找的是每2k区间的起点,所以可以不需要计数器和逻辑代码处理,那样反而复杂了,只需在循环的步数上做文章。注意这里给出了在[start,end)中反转的方法,也优化了上一题的思路。

class Solution:
    def reverse(self,lst,start,end):
        while end-start >1: #至少两个数
            lst[start],lst[end-1] = lst[end-1],lst[start]
            start+=1
            end-=1
    def reverseStr(self, s: str, k: int) -> str:
        size = len(s)
        lst = list(s)
        for i in range(0,size,2*k):
            if i+k <= size:
                self.reverse(lst,i,i+k)   
            else:
                self.reverse(lst,i,size)
        s = ''.join(lst)
        return s

特别地,利用python切片的便利性,有个更巧妙的方法比较难想到,可以不停地更新s,达到“就地”更改的作用。注意实际不是就地,而是每次循环中,你都是创建一个新的字符串,而这个新字符串是在原有字符串基础上进行拼接和反转得到的。尽管 Python 字符串不可变,每次的修改都生成了新的字符串,这种方式通过不断地构建和替换,达到了预期的效果。

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        p = 0
        while p < len(s):
            p2 = p + k
            s = s[:p] + s[p:p2][::-1]+s[p2:]  #[0,p)保持,[p,p2)反转,[p2,size)保持
            p = p + 2* k
        return s

kama 54.替换数字(第八期模拟笔试)

思路

如果是用py,这题很简单,就是将字符串转为字符串list后,将对应位置的值修改为'number',再转为字符串即可,就不需要考虑修改后大小变化的问题了。

class Solution:
    def changeNumber(self, s):
        lst = list(s)
        size = len(lst)
        for i in range(size):
            if lst[i].isdigit():
                lst[i]='number'
        return ''.join(lst)

心得体会

通过做字符串的题目,更加认识到了循环条件的思考方式,对于左闭右开区间,有两种思路

  • 一种是类似C++迭代器那种,iter < end,表达是右界桩,因此在循环中最多到达end的前一个。
  • 另一种是考虑区间包含的元素数量,[start,end) 包含的数量为end-start个元素,因此判断循环至少需要几个元素,如541中反转区间字符串函数,while循环的循环条件就是区间内至少包含2个元素,因此条件为 end-start>1或者 end-start>=2

另外,学习了py中可变对象,不可变对象,浅拷贝深拷贝与切片的关系。特别地,将切片赋值给变量和直接用切片赋值有不同的效果和行为,如果是赋值给变量,得到的变量是对原列表指定范围的浅拷贝,当修改切片中的可变对象时,会影响到原列表。而替换时不会影响到。对于直接用切片赋值,可以达到修改原列表内容的效果。

# 切片赋值给变量,再去修改的情况(浅拷贝)
lst = [0,1,2,3,4,5,6]
sliced = lst[1:3]
sliced[1] = 100
print(lst) # 输出:[0, 1, 2, 3, 4, 5, 6] 元素为不可变变量直接无法修改(不可变对象的浅拷贝没有意义)

lst = [[1, 2], [3, 4], [5, 6]]
sliced = lst[1:3]
# 修改切片中的第一个子列表的元素
sliced[0][0] = 10
sliced[1]=[1,2,3,4] #此时已经修改了引用,后续的处理都不会影响到lst[2]了,只有不修改引用时,修改内容如修改slice[1][0]或者slice[1].append等可以修改lst[2]
print(lst)      # 输出:[[1, 2], [10, 4], [5, 6]] #元素为可变变量,只能修改其内容,不能替换
print(sliced)   # 输出:[[10, 4], [1,2,3,4]]]


# 切片直接修改的情况
original_list = [1, 2, 3, 4]
original_list[1:3] = [10, 20]
print(original_list)  # 输出:[1, 10, 20, 4]

标签:end,Day8,start,修改,part1,lst,字符串,size
From: https://www.cnblogs.com/haohaoscnblogs/p/18320677

相关文章

  • Python查找字符串的CRC32
    我尝试获取字符串数据类型变量的CRC32,但出现以下错误:>>>message='helloworld!'>>>importbinascii>>>binascii.crc32(message)Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:aby......
  • 如何将字符串转换为十进制数字?
    我有一个包含以下格式字符串的python列表:A1=['"29.0"','"65.2"','"75.2"']如何将这些字符串转换为十进制数字以对列表元素执行算术运算?可以使用float()函数将字符串转换为十进制数。以下是如何执行此操作的示例:A1=['"29.0"',�......
  • 41-50题矩阵和字符串 在Java中,将大写字符转换为小写字符的方法主要有以下几种:
    20240723一、数组最后几个和字符串的两个448.找到所有数组中消失的数字(和645.错误的集合差不多)283.移动零118.杨辉三角119.杨辉三角II661.图片平滑器(没看懂)598.区间加法II566.重塑矩阵303.区域和检索-数组不可变520.检测大写字母125.验证回文串二、在Jav......
  • 简答理解【字符指针】,存放字符串首地址???
    2024-07-23笔记-5作者(Author):仟濹(网名)字符指针①定义指针的时候也赋值字符串为什么给一个指针赋值字符串的时候也可以打印出来整个字符串???//eg:char*p="abcdefg";printf("%s",p);//abcdefgputs(p);//同理printf("%s",p+1);//bcdefgputs(p+1);/......
  • day8 字符数组
    字符数组用来存放字符数据的数组叫字符数组。字符数组中每一个元素存放一个字符。字符数组主要用于处理c中字符串的使用。字符串:“helloworld”用双引号引用起来的就是字符串,在双引号中,字符串中的字符不可更改。字符串在内存当中按照先后次序排列起来c语言中,规定了字符串......
  • 字符串数组
    一、二分查找法将一个有序的数列取中值,判断数在哪一段,每次筛选原来的一半,重复多次二、字符串数组(容器,用来存放字符)1.初始化内容:chars[100]=“hello”(字符串常量)字符串结束标志:\0(空字符)单一性、连续性、有序性2.输出字符串puts(s)=puts(&s[0])3.输入字符串scanf......
  • 04-【编写loader工程内容】利用内联汇编显示字符串
    在开发操作系统过程中,有时必须使用某些特殊的指令(如inb/outb/hlt),而C编译器无法自动使用这些指令。因此,如果要使用这些指令,有两种方式:1.在汇编文件中为该指令的使用创建汇编函数(子程序),然后在C代码中以函数调用的方式去使用;2.使用内联汇编:即在C代码中嵌入汇编程序。......
  • 第四十七天 第九章 动态规划part13 647. 回文子串 516.最长回文子序列
    647.回文子串 dp和双指针。dp[i][j]的含义:表示区间范围[i,j](注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。在确定递推公式时,就要分析如下几种情况。整体上是两种,就是s[i]与s[j]相等,s[i]与s[j]不相等这两种。当s[i]与s[j]不相等,那没啥好说的......
  • Python中如何实现字符串的查询和替换?
    在Python中,字符串的查询和替换是编程中常见的任务,它们可以通过Python的内置方法和库来高效实现。这些操作对于文本处理、数据清洗、日志分析等场景尤为重要。下面,我将详细阐述如何在Python中实现字符串的查询和替换,包括基础方法、高级技巧以及在实际应用中的注意事项。字符......
  • Python字符串:提取重复和随机合并的子字符串
    重复和合并字符串的示例:16.01068.0%08p%.a.p.a.要提取的所需子字符串:16.008%p.a.完整示例:CCoonnttiinnggeennttCCoouuppoonn16.01068.0%08p%.a.p(.Ma.o(nMtholyn)thly)所需子字符串:ContingentCoupon16.008%p.a.(Monthly)我的问题是当原始......