代码随想录第55期训练营第八天|LeetCode344.反转字符串、541.反转字符串II、卡码网:54.替换数字
前言
这是我参加的第二次训练营!!!爽!这次我将更加细致的写清每一道难题,不仅是提升自己,也希望我自己的写的文章对读者有一定的帮助!
打卡代码随想录算法训练营第55期第八天(づ ̄3 ̄)づ╭❤~
首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第55期的训练营大家庭一起进步。
今日题目
LeetCode 344 反转字符串
题目链接:344 反转字符串
文章讲解:反转字符串
视频讲解:卡哥讲解 —— 反转字符串
这道题没有什么好说的,如果这都没有想到左右指针的话,应该是新手,多练,多刷,自然会有感觉。
public class Solution {
public void ReverseString(char[] s) {
//左右指针 中间值交换即可
for(int i = 0,right = s.Length - 1; i < s.Length / 2; i++,right--)
{
char temp = s[i];
s[i] = s[right];
s[right] = temp;
}
}
}
LeetCode 541 反转字符串II
题目链接:541 反转字符串II
文章讲解:反转字符串II
视频讲解:卡哥讲解 —— 反转字符串II
这道题其实有点迷惑人的意思了,其实就是一段字符串,从左往右遍历K个翻转,然后再遍历K个不动,再遍历K个翻转,直到最后剩下不到K个,全部翻转,所以在for循环中,翻转的只是K个,而不是2K个,注意审题。
public class Solution {
public string ReverseStr(string s, int k) {
if(s.Length == 1)
return s;
char[] array = s.ToArray<char>();
for(int i = 0; i < s.Length; i += 2 * k/*每次移动2k个字符*/)
{
if(i + k <= s.Length)//看是否够翻转k个长度
Reverse(array , i , i + k - 1);
else//不够则把剩下的全部反转
Reverse(array, i , array.Length - 1);
}
return new string(array);
}
//翻转函数
public char[] Reverse(char[] array, int left, int right)
{
while(left < right)
{
char temp = array[left];
array[left] = array[right];
array[right] = temp;
left++;
right--;
}
return array;
}
}
卡码网 54 替换数字
题目链接:54 替换数字
文章讲解:替换数字
本题确实好理解,但是引用了一个非常牛逼的思路就是后序,因为对于数组来说,如果从头遍历,每次往后扩充就会导致后面的值往后扩充,但是如果是后序的话,就巧妙的避开了这个问题。
#include <iostream>
using namespace std;
int main() {
string s;
while (cin >> s) {
int sOldIndex = s.size() - 1;
int count = 0; // 统计数字的个数
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') {
count++;
}
}
// 扩充字符串s的大小,也就是将每个数字替换成"number"之后的大小
s.resize(s.size() + count * 5);
int sNewIndex = s.size() - 1;
// 从后往前将数字替换为"number"
while (sOldIndex >= 0) {
if (s[sOldIndex] >= '0' && s[sOldIndex] <= '9') {
s[sNewIndex--] = 'r';
s[sNewIndex--] = 'e';
s[sNewIndex--] = 'b';
s[sNewIndex--] = 'm';
s[sNewIndex--] = 'u';
s[sNewIndex--] = 'n';
} else {
s[sNewIndex--] = s[sOldIndex];
}
sOldIndex--;
}
cout << s << endl;
}
}