代码随想录算法训练营:8/60(日期更新)

非科班学习算法day8(日期更新) | LeetCode344: 反转字符串,Leetcode541:反转字符串|| ,卡码:替换数字 

目录

介绍

一、基础概念补充:

1.STL库函数

2. ASCII码

二、LeetCode题目

1.LeetCode344:反转字符串 

题目解析

 2.Leetcode541:反转字符串|| 

题目解析

3.替换数字

题目解析

总结


介绍

包含LC的三道题目,还有相应概念的补充。

相关图解和更多版本:

代码随想录 (programmercarl.com)https://programmercarl.com/#%E6%9C%AC%E7%AB%99%E8%83%8C%E6%99%AF


一、基础概念补充:

1.STL库函数

【STL】STL函数总结,助你代码实用高逼格-CSDN博客

2. ASCII码

ASCII码详解_ascll-CSDN博客

二、LeetCode题目

1.LeetCode344:反转字符串 

题目链接:344. 反转字符串 - 力扣(LeetCode)

题目解析

       很多写法的一道题,也让我们可以意识到库函数的重要性。当然我最喜欢的方法是reverse函数,同时也贴出更底层的实现版本。

 c++代码如下:

class Solution {
public:
    void reverseString(vector<char>& s) 
    {
        reverse(s.begin(), s.end());
    }
};

注意点1:只需要注意是迭代器位置就好

swap版本:

class Solution {
public:
    void reverseString(vector<char>& s) 
    {
        //原地交换位置
        //定义两个指针
        int left = 0;
        int right = s.size() - 1;
        
        //收缩
        while(left <= right)
        {
            swap(s[left], s[right]);
            left++;
            right--;
        }
    }
};

 不使用库函数版本:

class Solution {
public:
    void reverseString(vector<char>& s) 
    {
        int left = 0;
        int right = s.size() - 1;
        
        while(left <= right)
        {
            int temp = s[left];
            s[left] = s[right];
            s[right] = temp;
            left++;
            right--;
        }

    }
};

 2.Leetcode541:反转字符串|| 

题目链接:541. 反转字符串 II - 力扣(LeetCode)

题目解析

       我觉得这道题就足以展现绕圈子的魅力(恶心),自己写会想着模拟他说的过程,设置很多if检查,其实就是将步长设置为2k,并且检查最后一段的长度就可以了。

 C++代码如下: 

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

注意点:就是不要惯性思维上去就是i++,另外就是检查好左闭右开区间就可以。

3.替换数字

题目链接:54. 替换数字(第八期模拟笔试) (kamacoder.com)

题目解析

       这道题从实现来说有好几种写法,我就是尝试先新建一个字符串接受信息。

C++代码如下:


#include<iostream>
using namespace std;
 
int main()
{
    string s;
    cin >> s;
    string new_str;
    int fast = 0;
    int slow = 0;
         
    while(fast < s.size())
    {
        if(s[fast] >= 'a')
        {
            new_str += s[fast];
            fast++;
            slow++;
        }
        else
        {
            fast++;
            new_str += "number";
            slow += 7;
        }
    }
    cout << new_str << endl;
}
/**************************************************************
    Problem: 1064
    User: odCYZ6r27J3eZLOmW5Y2bc2N83vw [kamaCoder74837]
    Language: C++
    Result: 正确
    Time:33 ms
    Memory:2180 kb
****************************************************************/

注意点1:什么都要自己写还是比较麻烦的,这时候要注意题目的要求,写好头文件和输出

注意点2:这里的一个操作是字符串拼接,可以用“+”或者“+=”

 下面写一种更为优秀的,不用新建空间的写法:

#include <iostream>
using namespace std;
 
int main()
{
    string s;
    cin >> s;
     
    //设置后指针
    int p1 = s.size() - 1;
    int count = 0;
    for(int i = 0; i < s.size(); i++)
    {
        if(s[i] >= '0' && s[i] <= '9')
        {
            count++;
        }
    }
    s.resize(s.size() + 5 * count);
     
    //设置后指针
    int p2 = s.size() - 1;
     
    for(; p1 >= 0; p1--)
    {
        if(s[p1] >= '0' && s[p1] <= '9')
        {
            s[p2] = 'r';p2--;
            s[p2] = 'e';p2--;
            s[p2] = 'b';p2--;
            s[p2] = 'm';p2--;
            s[p2] = 'u';p2--;
            s[p2] = 'n';p2--;
        }
        else
        {
            s[p2] = s[p1];
            p2--;
        }
    }
     
    std::cout << s << std::endl;
     
}
/**************************************************************
    Problem: 1064
    User: odCYZ6r27J3eZLOmW5Y2bc2N83vw [kamaCoder74837]
    Language: C++
    Result: 正确
    Time:31 ms
    Memory:2180 kb
****************************************************************/

注意点1:有一个地方写法可以优化

//s[p2] = 'r';p2--;
s[p2--] = 'r';

注意点2: 在给字符串扩容之前就要预先定义好尾部指针,要不就会更新掉。而且关于扩容,我们需要注意是*5,而不是*6.

注意点3:这里比对的0.......9都是字符串形式,一定不要写成int形。

总结


打卡第8天,今天实验非要给我拖到晚上,实验条件什么的我自己也搞得乱七八糟,和试验员交流好久,希望之后再也不要接触橡胶,再也不要做非线性,虽然机械很多时候可以不动脑子,但是人浮于事,效率低下,虽然不能说别的行业就一定好,但是在车辆呆了第六年了,完全看不到制造业的优点。字符串给我的感觉需要代码能力深厚,所以继续加油,坚持!!!

代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值