1.反转字符串 344. 反转字符串
输入:s = ["h","e","l","l","o"] 输出:["o","l","l","e","h"]
class Solution {
public:
void reverseString(vector<char>& s) {
int lift = 0;
int right = s.size() - 1;
while ( lift < right ) {
swap(s[lift] , s[right]);
lift++;
right--;
}
}
};
用两个指针一头一尾,依次进行交换
2.反转字符串II 541. 反转字符串 II
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。输入:s = "abcdefg", k = 2 输出:"bacdfeg"
class Solution {
public:
string reverseStr(string s, int k) {
for ( int i = 0 ; i < s.size() ; i += 2 * k ) {
if ( i + k <= s.size() ) {
reverse( s.begin() + i , s.begin() + i + k );
}else reverse( s.begin() + i , s.end() );
}
return s;
}
};
注意 for 循环 的i 是以2*k 为步长的,每次 i 就是 要进行反转的 头
3.替换空格 剑指 Offer 05. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."
class Solution {
public:
int space(string s) {
int count = 0;
for ( int i = 0 ; i < s.size() ; i++ ) {
if ( s[i] == ' ' ) {
count++;
}
}
return count;
}
string replaceSpace(string s) {
int count = space(s);
int start = s.size();
s.resize( s.size() + count * 2 );
for ( int i = start - 1 , j = s.size() - 1 ; i < j ; i--, j-- ) {
if ( s[i] != ' ') {
s[j] = s[i];
}else {
s[j] = '0';
s[j - 1] = '2';
s[j - 2] = '%';
j = j - 2;
}
}
return s;
}
};
space 用来 记录 空格 个数,因为空格本身是可以填充的 ,所以添加的空间 就是 空格个数的2倍,
i 为句子最后一个字母 的下表 ,j 表示扩充数组后 最后的一个,j 和 i 同时 前进 ,j 记录 i 的元素
当 i 指向 空格 的时候 ,j 和 j 前两个 填充 题目要求的,之后 j 跳到 j - 2
当 i 和 j 相等时 就代表 填充 完毕
4.翻转字符串里的单词 151. 反转字符串中的单词
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = "the sky is blue"
输出:"blue is sky the"
class Solution {
public:
string reverseWords(string s) {
int slow = 0;
for (int i = 0; i < s.size(); ++i) {
if (s[i] != ' ') {
if (slow != 0) s[slow++] = ' '; //退出while后 i一直加 直到遇到下一个不是空格 在记录前 添加一个空格 做单词前的 空格
while (i < s.size() && s[i] != ' ') { //将单词 记录 一到空格 退出 while
s[slow] = s[i];
slow++;
i++;
}
}
}
s.resize(slow);
reverse(s.begin() , s.end()); //先整体反转
int start = 0;
for ( int i = 0 ; i <= s.size() ; i++ ) {
if ( i == s.size() || s[i] == ' ') {
reverse( (s.begin()+start) , (s.begin() + i ) ); //将每个单词再次反转,成正序
start = i + 1;
}
}
return s;
}
};
5.剑指Offer58-II.左旋转字符串 剑指 Offer 58 - II. 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(),s.begin() + n);
reverse(s.begin() + n ,s.end());
reverse(s.begin(),s.end());
return s;
}
};