文章目录
-
- 力扣 | 344 反转字符串
- 力扣 | 514 反转字符串 ||
- 剑指offer 05. 替换空格
- 力扣 | 151 . 翻转字符串中的单词
- 剑指offer 58-|| .左旋转字符串
一、344 反转字符串 :
整体思路:
双指针思想,前后两个指针,同时向中间靠拢(两两交换 对应的值,后再同时移动)。
解决方案:
void reverseString(vector<char>& s) {
int left=0;
int right=s.size()-1;
while( left <right ){
swap(s[left],s[right]);
left++;
right--;
}
}
二、 514 反转字符串 ||
题目链接:
整体思路:
借助库函数 reverse 实现, 遍历字符串,每次 移动2k
。
补充:
reverse() 函数 是C++中用于反转容器中的元素顺序。左闭右开。
函数原型: first
和 last
表示要反转的序列的起始和结束迭代器。
template < class BidirectionalIterator >
void reverse ( BidirectionalIterator first , BidirectionalIterator last ) ;
解决方案:
string reverseStr(string s, int k) {
int size = s.length(); //字符串的长度
//每一段的是2k
for(int i = 0; i < size ; i += 2*k){
//剩余的字符小于 2k 但是大于或等于k
if( i+k <=size ){
reverse(s.begin()+i,s.begin()+i+k);
}else{ //剩余得字符少于 k个
reverse(s.begin()+i,s.end());
}
}
return s;
}
三、 剑指offer 05. 替换空格
题目链接:
由于力扣下架了剑指offer, 所以跳转之后不是我们想要的题目。
题目描述:
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。(我们这里要求不能使用额外的空间)。
示例 1: 输入:s = "We are happy."
输出:"We%20are%20happy."
思路:
遍历字符串 ,将原来的字符串扩大每个空格替换成"%20"之后的大小。然后双指针的思想,从后往前遍历,替换空格。
具体解决方案
string replaceSpace(string s){
int legth = s.length(); //原始的长度
int size = s.length();
for (int i = 0; i < s.length(); i++) {
if (s[i] == ' ') {
size += 2;
}
}
s.resize(size); //重新设置s的大小
//从后面往前遍历
int kuai = legth-1, man = size-1;
for ( ; kuai >= 0; kuai--) {
if (s[kuai] == ' ') {
s[man--] = '0';
s[man--] = '2';
s[man--] = '%';
}else {
s[man] = s[kuai];
man--;
}
}
return s;
}
四、151 . 翻转字符串中的单词
题目链接
解题思路:
1、去掉字符串多余的空格( 双指针的思想 )。
2、将字符串整体翻转。
3、再对局部进行翻转。
解题方案:
string reverseWords(string s) {
int kuai = 0, man = 0 ;
for ( ; kuai < s.length(); kuai++ ) {
if (s[kuai] != ' ') { //遇到单词了
//手动添加空格
if (man != 0) s[man++] = ' ';
//收集单词
while ( kuai < s.length() && s[kuai] != ' ') { //如果遇到空格则停止收集
s[man++] = s[kuai++];
}
}
}
s.resize(man);
//第一次整体翻转
reverse(s.begin(), s.end());
//第二次局部翻转
int temp = 0; //辅助 i 来记录一个区间
int i = 0;
while ( i < s.length() ) {
if ( s[i]!= ' ') {
i++;
continue;
}
reverse( s.begin() + temp , s.beg
in() + i );
temp = i + 1 ;
i++;
}
//处理最后一个单词
reverse(s.begin() + temp, s.end());
return s;
}
五、剑指offer 58-|| .左旋转字符串
题目链接:
思路:
先整体翻转,再局部进行翻转。
解题方案:
string dynamicPassword(string password, int target) {
//先整体翻转
reverse( password .begin() , password.end());
//然后局部翻转
int size = password.length();
reverse(password.begin() ,password.begin()+ (size-target));
reverse(password.begin()+ (size-target), password.end());
}
友情链接 (代码随想录)