代码随想录算法训练营|Day8 字符串 344反转字符串 541反转字符串2 151 翻转字符串里的单词

当图像配准遇见边缘计算:低功耗设备的优化实践 本文探讨了在边缘计算环境下优化图像配准技术的实践方法,重点解决低功耗设备如树莓派和Jetson Nano上的算力瓶颈问题。通过算法轻量化、硬件加速和内存优化等策略,实现了毫秒级图像配准,适用于智能安防、移动医疗等实时性要求高的场景。 阅读详情

视频资源:代码随想录Carl讲课视频

第四章 字符串part01

 今日任务 

  •  344.反转字符串
  •  541. 反转字符串II
  • 卡码网:54.替换数字
  •  151.翻转字符串里的单词
  • 卡码网:55.右旋转字符串

 详细布置 

 344.反转字符串 

建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时候 不用库函数 

题目链接/文章讲解/视频讲解:代码随想录

原题:

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:
输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

笔记原地操作,不要去申请新的字符串啦,O(1)

两个头进行交换,首尾交换,次首尾交换,很自然想到头尾各一个指针,两两交换的位置
双指针同时向中间移动,就非常熟悉了,有序数组的平方也是两个指针往中间移动。

代码实现(伪代码)

len = num.size()
for (i = 0, j = len - 1; i < len/2; i++, j--)/*i和j同时移动,控制了i,就控制了j*/
    swap(nums[i], nums[j]);

代码实现(C++/Java/Python)

void reverseString(vector<char>& s) {
    for (int i = 0, j = s.size() - 1; i < s.size()/2; i++, j--) {
        swap(s[i], s[j]);
}
class Solution {
    public void reverseString(char[] s) {
        int l = 0;
        int r = s.length - 1;
        while(l < r) {
            s[l] ^= s[r];//构造 a ^ b 的结果,并放在a中
            s[r] ^= s[l];//将 a ^ b 这一结果再 ^ b ,存入b中,此时 b = a, a = a ^ b
            s[l] ^= s[r];//a ^ b 的结果再 ^ a ,存入 a 中,此时 b = a, a = b 完成交换
            l++;
            r--;
        }
    }
}

//第二种方法用temp来交换数值更多人容易理解些
class Solution {
    public void reverseString(char[] s) {
        int l = 0;
        int r = s.length - 1;
        while(l < r) {
            char temp = s[l];
            s[l] = s[r];
            s[r] = temp;
            l++;
            r--;
        }
    }
}

Python:

(版本一) 双指针

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        left, right = 0, len(s) - 1
        
        # 该方法已经不需要判断奇偶数,经测试后时间空间复杂度比用 for i in range(len(s)//2)更低
        # 因为while每次循环需要进行条件判断,而range函数不需要,直接生成数字,因此时间复杂度更低。推荐使用range
        while left < right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1
       

(版本二) 使用栈

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        stack = []
        for char in s:
            stack.append(char)
        for i in range(len(s)):
            s[i] = stack.pop()
       

(版本三) 使用range

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

(版本四) 使用reversed

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        s[:] = reversed(s)
       

(版本五) 使用切片

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        s[:] = s[::-1]
       

(版本六) 使用列表推导

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

(版本七) 使用reverse()

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        # 原地反转,无返回值
        s.reverse()
       

总结

交换元素不同的语言不一样。


 541. 反转字符串II

建议:本题又进阶了,自己先去独立做一做,然后在看题解,对代码技巧会有很深的体会。 

题目链接/文章讲解/视频讲解:代码随想录

力扣题目链接(opens new window)

给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。

如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例:

输入: s = "abcdefg", k = 2
输出: "bacdfeg"

笔记

abcdefgz

cbadefzg

for(i = 0; i < s.size; i++) 很多小伙伴习惯性这么写,其实在这里没必要写i++,而是写i+=2k
        count++;
        if (count == 2k…这样就把题目写复杂了

代码实现(伪代码)

for(i = 0; i < s.size; i += 2k) {
    if(i + k <= s.size) {
        reverse(s, i, i+k);   //abc k=3 i=0 理论上长度是k
        continue;
    }
    reverse(s, i, s.size);
}

代码实现(C++/Java/Python)

 卡码网:54.替换数字 

建议:对于线性数据结构,填充或者删除,后序处理会高效的多。好好体会一下。

题目链接/文章讲解:代码随想录

 151.翻转字符串里的单词 

建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。 

题目链接/文章讲解/视频讲解:代码随想录

力扣题目链接(opens new window)

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:
输入: "the sky is blue"
输出: "blue is sky the"

示例 2:
输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:
输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个

双指针移除空格

将原字符串进行一个整体的翻转,之后,对每一个单词(用空格格出来的)每个再进行翻转。要把多余的空格删除掉。重点讲一下空格,这个操作没有涉及到什么算法,leetcode没有要求空间复杂度为O(1),我们要求。不能申请一个新的字符串。倒序输入到一个新的字符串里。
多余的空格如何删除掉,很类似,数组章节讲了移除元素,空格就是元素,移除空格,上来很直白的想法,一个if遇到就erase,时间复杂度是n^2。

代码实现(伪代码)

//原地操作,没有去申请一个新的字符串
fast//获取符合题目要求的字母
slow//获取更新后在哪里

slow = 0;
for (fast = 0; fast < s.size(); fast++)
    if (s[fast] != " ") {
        if (slow != 0) s[slow++] = ' ';
        if (fast < s.size && s[fast] != ' ') {
            s[slow] = s[fast]
                fast++;
                slow++;
        }
    }
    s.resize(slow);

代码实现(C++/Java/Python)

卡码网:55.右旋转字符串 

建议:题解中的解法如果没接触过的话,应该会想不到

题目链接/文章讲解:

代码随想录

Windows环境下DataEase一站式安装指南(含WSL2+Docker配置) 本文详细介绍了在Windows环境下通过WSL2和Docker快速部署DataEase的完整教程。从WSL2配置、Docker环境搭建到DataEase离线安装,逐步指导用户完成一站式部署,特别适合需要快速搭建数据分析平台的开发者。教程包含常见问题解决方案和性能优化技巧,帮助用户高效使用这款国产开源数据可视化工具。 阅读详情

相关推荐

OpenClaw + Antigravity + 飞书完整部署教程

在 Linux 服务器上部署 OpenClaw,使用 Antigravity 本地代理 AI 模型,并接入飞书实现 24 小时在线 AI 助手。

Maynor的博客 1727

代码随想录算法训练营Day8 | 字符串(1/2) LeetCode344.反转字符串541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串单词

字符串练习第一天

记录学习每一天! 83

SXU—软件测试方法和技术-朱少民-第四部分 软件测试流程和规范-附考点

软件测试方法和技术-朱少民-第四章 软件测试流程和规范—这本书最后一部分的考点整理,考点分析

weixin_63597914的博客 1732

代码随想录算法训练营Day8|344.反转字符串541. 反转字符串II、替换数字、151.翻转字符串单词、右旋字符串

本题要反转一个字符串,可以直接利用库函数reverse实现,自己构造也很轻松。本题也是反转字符串,只是要按照题目所给的条件反转符合条件的部分字符串,需要进行一些具体的判断。本题要求将字符串中的数字转化为字符串"number",若能够使用额外的辅助空间,本题实现并不难,直接将原字符串中的字符依次往辅助空间中添加,遇到数字时,改为添加"number"字符串,最后返回辅助空间即可。若只能在原字符串中实现替换,则就显得略微麻烦些。本题要翻转字符串中的单词,并且将开头末尾的空格删除,单词之间有且仅有一个空格。

m0_68682181的博客 1301

代码随想录算法训练营DAY8|C++字符串Part.1|LeetCode:344.反转字符串541.反转字符串151.翻转字符串单词|卡码网:替换数字、右旋字符串

但是,一个erase本来就是O(n)的操作erase操作上面还套了一个for循环,那么以上代码移除冗余空格的代码时间复杂度为O(n^2)。其实跟上题的逻辑很类似,即整体倒序和子串倒序,达到翻转子串的目的。状态:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练;使用双指针法来去移除空格,最后resize(重新设置)一下字符串的大小,就可以做到O(n)的时间复杂度。反转字符串,最直接的思路除了使用库函数,那么就是双指针了。同理,先子串反转,再整体反转

糖炒栗子 1118

代码随想录算法训练营Day8 |344.反转字符串541. 反转字符串II● 54.替换数字● 151.翻转字符串单词● 55.右旋转字符串

这段代码利用了双指针的思想,从字符串的两端开始,逐步向中间移动,交换对应位置上的字符,从而实现了字符串翻转。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。在确定了要反转的子字符串的起始和结束位置之后,使用双指针法对该子字符串进行反转操作。解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。输入:["H","a","n","n","a","h"]输出:["h","a","n","n","a","H"]输入:["h","e","l","l","o"]

2201_75378283的博客 1319

代码随想录算法训练营第八天 | 344. 反转字符串 541. 反转字符串II 卡码网:54.替换数字 151.翻转字符串单词 卡码网 55.右旋字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。示例 1:输入:["h","e","l","l","o"]输出:["o","l","l","e","h"]示例 2:输入:["H","a","n","n","a","h"]输出:["h","a","n","n","a","H"]

zhang1282882326的博客 1245

代码随想录算法训练营Day08】转字符串541. 反转字符串II; 卡码网:54.替换数字; 151.翻转字符串单词; 卡码网:55.右旋转字符串

for循环内不要直接写i++,写成i+=2k,这样一次操作2k个字符就很方便。先把s分成几个长度为2k的字符串,然后进行交换。返回字符的字符串形式,字符串的长度仅为1。:在文中该处插入一个tab键。:在文中该处插入一个后退键。:在文中该处插入换页符。:在文中该处插入单引号。:在文中该处插入双引号。:在文中该处插入反斜杠。双指针不断往中间移动。:在文中该处插入回车。

Tammy2001的博客 1060

代码随想录算法训练营Day8 | 344.反转字符串541. 反转字符串II● 卡码网:54.替换数字● 151.翻转字符串单词● 卡码网:55.右旋转字符串

今天的题目写了很久。特别是翻转字符串单词这题,想了一两个小时,一直在试,后面实在是不行了,就去看了视频和文章讲解,一起来看今天的题目吧!344.反转字符串

2401_82757749的博客 1338

代码随想录算法训练营Day8 | Leetcode 151翻转字符串单词、卡码网:55右旋转字符串

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。例如,对于输入字符串 “abcdefg” 和整数 2,函数应该将其转换为 “fgabcde”。给你一个字符串 s ,请你反转字符串单词的顺序。整体反转 + 逐词反转

叽里呱啦大王的博客 297

代码随想录算法训练营Day8 | 344 反转字符串541 反转字符串II、 卡码网 替换数字、151 翻转字符串单词、卡码网 右旋字符串

抱歉,又食言拖更了,呃呃,忽然能理解那些up主不定时更新(拖更)的理由了(笑),但我不是因为这几天摆烂嗷,还是在很辛苦地追进度的,刚刚结束队列,哇咔咔,队列的最后两道题真的苦煞我也,今天全耗在上面了~想着也是该把前面的回顾回顾了,所以今晚就复习字符串然后二叉树稍微开个小头吧~

pepperony3000的博客 946

代码随想录算法训练营 DAY8 | 344.反转字符串 541.反转字符串II 卡码网54.替换数字 151.反转字符串中的单词 卡码网55.右旋字符串

java中String是不可变的。可以考虑新建一个然后用append拼接,或者用方法转化成char数组再进行操作。最后返回的时候。左旋/右旋字符串:先整体反转,再分别反转左半部分和右半部分即可swap方法可以用tmp或者位运算实现。注意是左闭右闭的去除一个字符串中多余空格的逻辑比较复杂,回顾移除数组那道题的实现,用快慢指针,slow指向符合的元素要放的位置,fast指针遍历整个串 去找不为空格的字符。放完一个单词之后要手动添加一个空格(注意首个字符的情况 不用放)

qq_35904005的博客 936

代码随想录算法训练营Day8 | 344.反转字符串541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串单词、卡码网:55.右旋 | Python | 个人记录向

字符串344.反转字符串541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串单词、卡码网:55.右旋。

Python基本算法 775

代码随想录算法训练营Day8|Leetcode344反转字符串541反转字符串II、剑指Offer05替换空格、151反转字符串单词、剑指Offer58-II左旋转字符串

Day8打卡!今日感想:今天的解题思路理解起来还可以,后两个题需要重点复习一下~💪

m0_60979177的博客 1936

代码随想录训练营打卡DAY 8 | 反转字符串

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。输入:[“H”,“a”,“n”,“n”,“a”,“h”]输出:[“h”,“a”,“n”,“n”,“a”,“H”]输入:[“h”,“e”,“l”,“l”,“o”]输出:[“o”,“l”,“l”,“e”,“h”]给定一个字符串,逐个翻转字符串中的每个单词

weixin_52362981的博客 819

代码随想录算法训练营Day7 | 344.反转字符串541.反转字符串||、替换数字、151.反转字符串中的单词、右旋字符串

反转字符串反转字符串中的单词、右旋字符串、替换数字

hero_jy的博客 1068

代码随想录算法训练营day8day9字符串344反转字符串541反转字符串II卡码54替换数字151翻转字符串单词卡码55.右旋转字符串28实现 strStr()459.重复的子字符串

主要就是双指针 和KMP。

wangcles的博客 1033

Carl代码随想录算法训练营-Day 8-344.反转字符串541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串单词、卡码网:55.右旋转字符串

本文是日常算法学习记录。今天完成了344.反转字符串541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串单词、卡码网:55.右旋转字符串,共五题,并用文字详细描述了算法运行过程。

BuleFACE_Zhang的博客 728

代码随想录训练营day08

此时第一段和第二段的顺序是我们想要的,但面的字符位置被我们倒叙,那么此时我们在把 第一段和第二段面的字符再倒叙一把,这样字符顺序不就正确了。本题中,我们需要将字符串右移n位,字符串相当于分成了两个部分,如果n为2,符串相当于分成了两个部分,如图: (length为字符串长度)其实,思路就是 通过 整体倒叙,把两段子串顺序颠倒,两个段子串的的字符在倒叙一把,负负得正,这样就不影响子串面字符的顺序了。然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。

chaizihao111的博客 1128

代码随想录算法训练营day8|344.反转字符串541. 反转字符串II、 卡码网:54.替换数字、151.翻转字符串单词、 卡码网:55.右旋转字符串

思路:最简单的方法就是直接调用库函数reverse,当然,这也可以用双指针法:对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。思路:最简单的是创建新字符串,遍历原字符串,将原字符串的字母拼接到新字符串中,若遇到数字,拼接“number";字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。

qq_60513199的博客 754

代码随想录算法训练营Day8

代码随想录算法训练营Day8

weixin_44520607的博客 811

leetcode 56合并区间

这道题你可以把它压缩成一个非常好记的思路:先排序,再逐个比较;能合并就扩右边界,不能合并就加入答案。具体来说,先用: 把所有区间按照左端点从小到大排序。排序之后,我们只需要拿“当前区间”和 最后一个已经合并好的区间比较。如果: 说明前一个区间的右端点比当前区间左端点还小,二者没有重叠: 所以直接: 如果不满足: 那就说明: 两个区间重叠,例如: 此时左端点不用动,只需要把右端点扩大: 所以整道题可以记成: 这道题容易忘的函数/语法 含义:对整个 排序。对于:

qq_63176310的博客 229

Xilinx_CAM.rar

CAM存储器的实现VHDL代码,根据官方xapp1151范例修改,可用于7系列的FPGA。开发环境:Vivado2018.3;仿真环境Modelsim10.6

SpringCloudDemo.zip

这是一个spring cloud的入门demo,使用eureka作为注册中心,ribbon作为负载均衡器,与MySQL数据库进行交互,实现数据的增删改查,通过两个提供者可以清楚地看到负载均衡的实现

上一篇: 代码随想录训练营|Day6 哈希表 理论基础 242 349连个数组的交集 202快乐数
下一篇: 代码随想录算法训练营Day9|28 实现strStr() 458重复的子字符串
鸠鸠鲁
博客等级 码龄7年 330粉丝 · 36原创
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值