1. lc 344 字符串反转
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O ( 1 ) O(1) O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
示例 2:
输入:[“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]
1.1 code
#include "vector"
#include "string"
using namespace std;
void reverseString(vector<char>& s){
for(int i = 0, j = s.size() -1; i < s.size()/2; i++, j--) swap(s[i], s[j]);
}
2. lc541 反转II
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = “abcdefg”, k = 2
输出: "bacdfeg
2.1 分析
题目的思想,是每 2k 长度为一个区间, 反转其中的 前k 个字符;
若长度不足 k, 则将其区间全部反转;
i +k < s.size() : 表明还没有到达最后一个区间位置,
2.2 code
using namespace std;
class Solution{
public:
void reverseString(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){
// 开始移动区间, 每次移动2k 个长度;
for(int i = 0; i < s.size(); i += (2*k)){
// 假如当前区间长度 前K 个字符仍在字符串以内, 则交换 前K 个字符;
if(i+k <= s.size() )
{ // i 从0 开始, i+k-1;
reverseString(s, i, i + k -1 );
// 注意, 反转一次便跳出当前循环,
continue;
}
// 否则的化, 表明当前区间, 前k个字符超过字符串, 即当前区间不足k个字符, 反转所有字符;
reverseString(s, i, s.size() -1);
}
return s;
}
};
3. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = “We are happy.”
输出:“We%20are%20happy.”
3.1 思路
-
先统计原数组中空格的个数;
-
使用 s.resize 对原字符串字符串数组进行扩容, 扩容后的大小有count 和原数组求出;
-
然后使用 指针的方法, 从后往前 开始遍历, i 指向原数组的末尾, j指向新数组的末尾;
注意,这里为什么是 从后向前开始遍历呢?
- 不用申请新数组。
- 从后向前填充元素,避免了从前先后填充元素要来的 每次添加元素都要将添加元素之后的所有元素向后移动。
#include "string"
using namespace std;
class Solution{
public:
string replaceSpace(string s){
int len1 = s.size();
// 1. 遍历原数组, 统计出其中的空格数目;
int count = 0;
for(int i = 0; i < s.size(); i++){
if( s[i] == ' ') count++;
}
// 2. 对原字符数组扩容;
s.resize(len1+ count *2 );
int len2 = s.size();
// 3. 使用双指针,开始移动字符串元素, i 从原字符串末尾位置开始, j 从新字符串末尾位置开始;
int i = len1 -1, j = len2 -1 ;
for(; 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;
}
};