代码随想录算法训练营第八天|Leetcode 344.反转字符串、541.反转字符串II、122.路径加密、151.反转字符串中的单词

 文档讲解: 代码随想录

视频讲解:字符串基础操作! | LeetCode:344.反转字符串_哔哩哔哩_bilibili 

字符串操作进阶! | LeetCode:541. 反转字符串II_哔哩哔哩_bilibili

字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词_哔哩哔哩_bilibili


 第八天,开始练习字符串的部分了,练就完了!

344.反转字符串

感受:字符与数组实现或思考的逻辑比较相似,这可能也是卡哥没有在网上做过多介绍而是直接衔接练题的原因。题目本身很简单,但记住不要使用库函数reverse。

思路: 双指针法秒了。

class Solution {
public:
    void reverseString(vector<char>& s) {
        int length = s.size();
        for(int i = 0, j = length - 1; i < length / 2; i++, j--){
            swap(s[i], s[j]);
        }
    }
};

541.反转字符串II

感受:上题的plus版本,内容差不多,无非是多了一些要求。

思路:调用库函数的逻辑我们没有变,不过改用reverse函数了,值得一提的是reverse函数里只需要两个容器,具体表示为reverse(s.begin(), s.end()).其次就是为了满足题目要求,我们在遍历过程中是2k个、2k个这样遍历,同时加上判断语句,如果剩余字符小于等于2k个但大于k个,就反转前k个字符,小于k个则全部反转。

class Solution {
public:
    string reverseStr(string s, int k) {
        for(int i = 0; i < s.size(); i += 2 * k){
            if(i + k <= s.size()){
                reverse(s.begin() + i, s.begin() + i + k);
                continue;
            }
            reverse(s.begin() + i, s.end());
        }
        return s;
    }
};

122.路径加密

感受:秒了

思路: 一开始我想的太复杂了,实际上就这么回事。直接遍历一遍字符串,遇到为“.”的直接赋值为“ ”就行了。

class Solution {
public:
    string pathEncryption(string path) {
        for(int i = 0; i < path.size(); i++){
            if(path[i] == '.'){
                path[i] = ' ';
            }
        }
        return path;
    }
};

151.反转字符串中的单词

感受:题目意思很好理解,但设计到很多字符串的操作,算是一道有综合性的题目。不看卡哥的视频本人大概率脑海里没有思路。

思路: 基本就分为三步:将整个字符串反转、去除多余空格、反转每个单词。

首先我们可以先写一个reverse函数方便我们后续进行字符串和单词的反转:

void reverse(string& s, int start, int end){
    for(int i = start, j = end; i < j; i++, j--){
        swap(s[i], s[j]);
    }
}

其次进行去除空格操作,我们是利用双指针法。 在循环里我们判断如果遇到的字符为空格就删除所有空格,并手动为每个单词前添加一个空格(首单词除外,也就是再额外加入判断如果当前为首单词就不进行任何操作)。最后将字符串长度裁剪为我们新得到的值。

最后通过判断当目前循环到串尾或空格,我们调用函数将单词反转即可。

class Solution {
public:
    void reverse(string& s, int start, int end){
        for(int i = start, j = end; i < j; i++, j--){
            swap(s[i], s[j]);
        }
    }
    void removeExtraSpace(string& s){
        int slow = 0;
        for(int i = 0; i < s.size(); i++){
            //当前值为非空格,将所有空格删掉
            if(s[i] != ' '){
                if(slow != 0) s[slow++] = ' ';  //这步是确定如果当前词不为首单词就需要添加空格
                while(i < s.size() && s[i] != ' '){
                    s[slow++] = s[i++];  //填上该单词
                }
            }
        }
        s.resize(slow);
    }
    string reverseWords(string s) {
        removeExtraSpace(s);
        reverse(s, 0, s.size() - 1);
        int start = 0;
        for(int i = 0; i <= s.size(); i++){
            //如果处于串尾或遇到空格说明遇到了单词,就进行反转
            if(i == s.size() || s[i] == ' '){ 
                reverse(s, start, i - 1);
                start = i + 1;  //更新下一个单词的开始下标
            }
        }
        return s;
    }
};

总结:用时3h,剑指offer里的题也太难了,留着以后做,先保证把主要任务都消化完。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第二十二天的算法训练营主要涵盖了Leetcode题目的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的子数组"。 首先是Leetcode 28题,题目要求在给定的字符串找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组找到长度最小的子数组,

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值