第一题:
原题链接:344. 反转字符串 - 力扣(LeetCode)
思路:
双指针,一根指向字符串的头部,一根指向字符串的尾部。两个指针向中间移动,交换两根指针指向的值。
代码如下:
class Solution {
public:
void reverseString(vector<char>& s) {
for(int i = 0, j = s.size() - 1; i < j; i++, j--){
swap(s[i], s[j]);
}
return;
}
};
第二题:
原题链接:541. 反转字符串 II - 力扣(LeetCode)
思路:
题目要求的是遍历到2k个字符然后反转2k字符的前k个字符。
于是我们遍历的时候直接i += 2 * k。这样我们就直接指向要反转的第一个元素。然后判断i + k是否超过了边界,如果没有超过直接反转前k个元素即可,若超过了就反转剩下的元素。
代码如下:
class Solution {
public:
string reverseStr(string s, int k) {
for(int i = 0; i < s.size(); i+=2 * k){
if(i + k <= s.size()){
for(int m = i, n = i + k - 1; m < n; m++, n--){
swap(s[m], s[n]);
}
}else{
for(int m = i, n = s.size() - 1; m < n; m++, n--){
swap(s[m], s[n]);
}
}
}
return s;
}
};
反转可以用reverse(s.begin() + i, s.begin() + i + k);
第三题:
原题链接54. 替换数字(第八期模拟笔试) (kamacoder.com)
思路:
先找出这个字符串中出现数字的个数,然后乘5,然后将字符串扩容。
然后从末尾遍历将字符填入对应的位置。