前言
這是我參加的第二次訓練營!!!爽!這次我將更加細致的寫清每一道難題,不僅是提升自己,也希望我自己的寫的文章對讀者有一定的幫助!
打卡代碼隨想錄算法訓練營第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; }
}