344.反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s
的形式给出
两个索引从两端向中间移动并交换相应元素
class Solution {
public:
void reverseString(vector<char>& s) {
int size = s.size()-1;
for(int i =0 ,j = size; i < j;){
char temp = s[i];
s[i] = s[j];
s[j] = temp;
i++; j--;
}
}
};
541. 反转字符串II
给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。 - 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
题目有点绕,就是每隔k个反转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()) {
reverse(s.begin() + i, s.begin() + i + k );
} else {
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
剑指Offer 05.替换空格
请实现一个函数,把字符串 s
中的每个空格替换成"%20"。
继续学习双指针的用法
先遍历字符串确定空格数量,扩充字符串大小,然后从后向前替换空格,双指针,i指向旧长度的末尾,j指向新长度的末尾,往前遍历当s[i] !=‘ ’时复制,当其为空格时替换成%20。
class Solution {
public:
string replaceSpace(string s) {
int sum = 0;//空格数
for(auto c:s){
if(c == ' ')
sum++;
}
int oldSize = s.size()-1;
s.resize(s.size()+2*sum);
int newSize = s.size()-1;
for(int i = oldSize, j = newSize; i < j; i--, j-- ){
if(s[i] != ' '){
s[j] = s[i];
}else {
s[j] = '0';
s[j-1] = '2';
s[j-2] = '%';
j -=2;
}
}
return s;
}
};
151.翻转字符串里的单词
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
class Solution {
void reverse(string &s,int start, int end){
for(int i = start,j = end;i < j; i++, j--){
swap(s[i],s[j]);
}
}
void removeSpace(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);
}
public:
string reverseWords(string s) {
removeSpace(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;
}
};
剑指Offer58-II.左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"
先分别翻转前n个和后n个字符,再对整个字符串翻转即可实现。
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;
}
};