非科班学习算法day8(日期更新) | LeetCode344: 反转字符串,Leetcode541:反转字符串|| ,卡码:替换数字
目录
介绍
包含LC的三道题目,还有相应概念的补充。
相关图解和更多版本:
代码随想录 (programmercarl.com)https://programmercarl.com/#%E6%9C%AC%E7%AB%99%E8%83%8C%E6%99%AF
一、基础概念补充:
1.STL库函数
2. ASCII码
二、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天,今天实验非要给我拖到晚上,实验条件什么的我自己也搞得乱七八糟,和试验员交流好久,希望之后再也不要接触橡胶,再也不要做非线性,虽然机械很多时候可以不动脑子,但是人浮于事,效率低下,虽然不能说别的行业就一定好,但是在车辆呆了第六年了,完全看不到制造业的优点。字符串给我的感觉需要代码能力深厚,所以继续加油,坚持!!!