前言
这是我参加的第二次训练营!!!爽!这次我将更加细致的写清每一道难题,不仅是提升自己,也希望我自己的写的文章对读者有一定的帮助!
打卡代码随想录算法训练营第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; }
}