- 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
class Solution {
public:
void reverseString(vector<char>& s) {
int i = 0;
int j = s.size() - 1;
while (i < j)
{
char c_swap = s[i];
s[i] = s[j];
s[j] = c_swap;
i++;
j--;
}
}
};
- 反转字符串 II
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
class Solution {
public:
string reverseStr(string s, int k) {
int i = 2;
int n = s.size();
while (i * k < n)
{
int start = i * k - 2 * k;
int j = i * k - k-1;
while (start < j)
{
char c_swap = s[start];
s[start] = s[j];
s[j] = c_swap;
start++;
j--;
}
i=i+2;
}
if ((i - 2) * k >= 0 && (n - (i - 2) * k) < k)
{
int start = (i - 2) * k;
int j = n-1;
while (start < j)
{
char c_swap = s[start];
s[start] = s[j];
s[j] = c_swap;
start++;
j--;
}
}
if ((n - (i - 2) * k) >= k && (n - (i - 2) * k) < 2 * k)
{
int start = (i - 2) * k;
int j = start+k-1;
while (start < j)
{
char c_swap = s[start];
s[start] = s[j];
s[j] = c_swap;
start++;
j--;
}
}
return s;
}
};
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.size();
int i = 0;
for ( i = 0; (i+1)*2 * k < n; i++)
{
reverse(s.begin() + i * 2 * k, s.begin()+ i * 2 * k + k);
}
reverse(s.begin() + i * 2 * k, s.begin() + min(i * 2 * k + k, n));
return s;
}
};