344.反转字符串
344. 反转字符串 - 力扣(LeetCode)
题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
解题方法:
方法一:使用c++库函数reverse
方法二:
- 定义两个双指针,i指向起始位置,j指向终止位置,i是字符串长度的一半,便于字符串反转
2.使用swap库函数对指针内容两两交换
class Solution {
public:
void reverseString(vector<char>& s) {
for(int i = 0 , j = s.size()-1 ; i < s.size()/2 ; i++ , j--) swap(s[i] , s[j]);
}
};
541.反转字符串Ⅱ
题目:给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
思路:
在for循环中的末尾循环体写为i+=(2*k),这样for循环每次就移动2k,使程序运行更加高效。
class Solution {
public:
string reverseStr(string s, int k) {
for(int i = 0 ; i < s.size() ; i += (2 * k)){//i每次移动2k步
if(i + k < s.size()){//如果i+k在长度内,则移动前k个字符
reverse(s.begin() + i , s.begin() + i + k);
}
else{//如果i+k超过了字符串的长度,全部反转
reverse(s.begin() + i , s.end());
}
}
return s;
}
};
54.替换数字(卡码网)
54. 替换数字(第八期模拟笔试) (kamacoder.com)
题目:给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。
例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
对于输入字符串 "a5b",函数应该将其转换为 "anumberb"
输入:一个字符串 s,s 仅包含小写字母和数字字符。
输出:打印一个新的字符串,其中每个数字字符都被替换为了number
思路:
1.设计两个指针,一个指向新的数组结尾,一个指向旧的数组结尾
- 从新的数组结尾开始替换掉数字,从后往前插入number
从后往前插入的好处:
- 不用为数组额外开辟空间
- 不必在插入字符时对其他元素进行后移操作
#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.resize(s.size() + count * 5);//动态扩充数组内存
int sNewIndex = s.size() - 1;
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;
}
}
151.反转字符串中的单词
题目:给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
思路:
1.移除多余空格
2.将单个字符串反转
3.将每个单词反转
class Solution {
public:
void reverse(string& s, int start, int end){
for (int i = start, j = end; i < j; i++, j--) swap(s[i], s[j]);
}
void removeExtraSpaces(string& s) {
int slow = 0;
for (int i = 0; i < s.size(); ++i) {
if (s[i] != ' ') {
if (slow != 0) s[slow++] = ' ';
while (i < s.size() && s[i] != ' ') {
s[slow++] = s[i++];
}
}
}
s.resize(slow);
}
string reverseWords(string s) {
removeExtraSpaces(s);
reverse(s, 0, s.size() - 1);
int start = 0;
for (int i = 0; i <= s.size(); ++i) {
if (i == s.size() || s[i] == ' ') {
reverse(s, start, i - 1);
start = i + 1;
}
}
return s;
}
};
55.右旋字符串
55. 右旋字符串(第八期模拟笔试) (kamacoder.com)
题目:
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
思路:
把字符串分为两倍分,首先进行整体倒序,再进行局部倒序
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n;
string s;
cin >> n;
cin >> s;
int len = s.size();
reverse(s.begin(), s.end());
reverse(s.begin(), s.begin() + n);
reverse(s.begin() + n, s.end());
cout << s << endl;
}