参考自《代码随想录》,leetcode
1、反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 $O(1)$ 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
//对于字符串,我们定义两个指针(也可以说是索引下标),
//一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,
//并交换元素。
void reverceString(vector<char> & s) {
for (int i = 0, j = s.size() - 1; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
2、反转字符串Ⅱ
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
class Solution {
public:
void reverce(string & s, int start, int end) {
for (int i = start, j = end; i<j; i++, j--) {
swap(s[i], s[j]);
}
}
string reverseStr(string s, int k) {
for(int i = 0; i < s.size(); i += (2 * k)) {
if (i + k <= s.size()) {
reverce(s, i, i + k - 1);
continue;
}
reverce(s, i, s.size() - 1);
}
return s;
}
};
3、替换空格
请实现一个函数,把字符串 s
中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy." 输出:"We%20are%20happy."
class Solution {
public:
string replaceSpace(string s) {
int j = 0;
int soldSize = s.size();
for (int i = 0; i < s.size(); i++) {
if (s[i] == ' ') {
j++;
}
}
s.resize(s.size() + j * 2);
int sNewSize = s.size();
for (int i = sNewSize - 1, j = soldSize - 1; j < i; i--, j--) {
if (s[j] != ' ') {
s[i] = s[j];
}
else {
s[i] = '0';
s[i - 1] = '2';
s[i - 2] = '%';
i -= 2;
}
}
return s;
}
};
4、反转字符串里的单词
给你一个字符串 s ,颠倒字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = "the sky is blue"
输出:"blue is sky the"
class Solution {
public:
void removeSpace(string & s) {
int slow = 0, fast = 0;
while (s.size() > 0 && fast < s.size() && s[fast] == ' ') {
fast++;
}
for (; fast < s.size(); fast++) {
if (fast - 1 > 0 && s[fast - 1] == s[fast] && s[fast] == ' ') {
continue;
} else {
s[slow++] = s[fast];
}
}
if (slow - 1 > 0 && s[slow - 1] == ' ') {
s.resize(slow - 1);
} else {
s.resize(slow);
}
}
void reverse (string & s, int start, int end) {
for (int i = start, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
string reverseWords(string s) {
removeSpace(s);
reverse(s, 0, s.size() - 1);
int start = 0;
int end = 0;
bool entry = false;
for (int i = 0; i < s.size(); i++) {
if (!entry) {
start = i;
entry = true;
}
if (entry && s[i] == ' ' && s[i - 1] != ' ') {
end = i - 1;
entry = false;
reverse(s, start, end);
}
if (entry && (i == (s.size() - 1)) && s[i] != ' ') {
end = i;
entry = false;
reverse(s, start, end);
}
}
return s;
}
};
5、左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2 输出: "cdefgab"
class Solution {
public:
void reverce(string &s ,int start, int end) {
for (int i = start, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
string reverseLeftWords(string s, int n) {
reverce (s, 0 ,s.size() - 1);
reverce (s, 0, s.size() - n - 1);
reverce (s, s.size() - n, s.size() - 1);
return s;
}
};