344. 反转字符串
题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
解答:双指针,一头一尾,依次交换,直到两个指针相遇为止。
代码实现:
class Solution {
public:
void reverseString(vector<char>& s) {
int len = s.size();
int left = 0, right = len - 1;
while(left<right){
int tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
};
使用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 个字符,其余字符保持原样。
解答:
本质上还是模拟。分三种情况,剩余元素不满k、剩余元素满k不满2k、2k一组的元素,依次解决即可。
代码实现:
class Solution {
public:
string reverseStr(string s, int k) {
int nums = s.size()/(2*k);
//如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
if ((s.size() - nums*2*k) >= k)
{
int left = nums*2*k, right = left+k-1;
reverse(left, right, s);
}
//剩余字符少于 k 个,则将剩余字符全部反转
else{
int left = nums*2*k, right = s.size()-1;
reverse(left, right, s);
}
//反转2k个一组的前k个
while(nums > 0){
int left = (nums-1)*2*k,right = left+k-1;
reverse(left, right, s);
nums--;
}
return s;
}
private:
//反转函数,未使用stl自带的
void reverse(int left, int right, string &s){
while(left<right){
swap(s[left++], s[right--]);
}
}
};
剑指offer05. 替换空格
题目描述:请实现一个函数,把字符串 s
中的每个空格替换成"%20"。
解答:
首先考虑空格只占一个位置,%20要占三个位置,肯定得扩充字符串,扩充2倍得空格数。
第二要将空格进行替换必然涉及到移动,想到27.移除元素的双指针方式。
第三如何移动。从前往后移动比较麻烦,较难实现。故考虑从后往前进行移动,right指向位置,left指向要移动的元素,碰到非空格就移动,碰到空格就依次插入0,2,%。
代码实现:
class Solution {
public:
string replaceSpace(string s) {
int count = 0, len = s.size()-1;
for (int i = 0; i<s.size(); i++){
if (s[i]==' ')
count++;
}
if (count==0)
return s;
// 扩充字符串s的大小,也就是每个空格替换成"%20"之后的大小
s.resize(s.size() + count * 2);
int right = s.size()-1;
for(int left = len; left>=0; left--){
if (s[left] != ' '){
s[right--] = s[left];
}
else{
s[right--] = '0';
s[right--] = '2';
s[right--] = '%';
}
}
return s;
}
};