344.反转字符串
注意到遍历指针应该只到数组中部,即(小于s.size()/2) 或直接使用swap()库函数
class Solution {
public :
void reverseString ( vector< char > & s) {
char tmp;
int work = s. size ( ) - 1 ;
for ( int i = 0 ; i < s. size ( ) / 2 ; i++ ) {
tmp = s[ i] ;
s[ i] = s[ work] ;
s[ work-- ] = tmp;
}
}
} ;
541.反转字符串2
迭代器的使用,第一想法是使用int型计数,但reverse()要传入地址 补充:上条傻了,无需计数器,只需在循环表达式上做出修改即可,且也不用非用迭代器(第二块代码来源:代码随想录) 需要注意的是定义迭代器是要赋初值,否则会报空指针异常 注意,循环体中各分支对于循环变量的改变,以保证正常退出循环
class Solution {
public :
string reverseStr ( string s, int k) {
string :: iterator c = s. begin ( ) ;
while ( c != s. end ( ) ) {
if ( s. end ( ) - c < k) {
reverse ( c, s. end ( ) ) ;
break ;
} else if ( s. end ( ) - c >= k && s. end ( ) - c < 2 * k) {
reverse ( c, c + k) ;
break ;
} else {
reverse ( c, c + k) ;
c += 2 * k;
}
}
return s;
}
} ;
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;
}
} ;
cama54.替换数字
逆天编译器 双指针or暴力replace() string、vector、queue支持resize()改变长度
# include <iostream>
using namespace std;
int main ( ) {
string s;
while ( cin >> s) {
int count = 0 ;
int sOldSize = s. size ( ) ;
for ( int i = 0 ; i < s. size ( ) ; i++ ) {
if ( s[ i] >= '0' && s[ i] <= '9' ) {
count++ ;
}
}
s. resize ( s. size ( ) + count * 5 ) ;
int sNewSize = s. size ( ) ;
for ( int i = sNewSize - 1 , j = sOldSize - 1 ; j < i; i-- , j-- ) {
if ( s[ j] > '9' || s[ j] < '0' ) {
s[ i] = s[ j] ;
} else {
s[ i] = 'r' ;
s[ i - 1 ] = 'e' ;
s[ i - 2 ] = 'b' ;
s[ i - 3 ] = 'm' ;
s[ i - 4 ] = 'u' ;
s[ i - 5 ] = 'n' ;
i -= 5 ;
}
}
cout << s << endl;
}
}
# include <iostream>
using namespace std;
# include <string>
int main ( ) {
string str;
cin >> str;
for ( int i = 0 ; i < str. size ( ) ; i++ ) {
if ( str[ i] < 'a' ) {
str. replace ( i, 1 , "number" ) ;
i += 5 ;
}
}
cout << str;
return 0 ;
}
151.翻转字符串中的单词
很多细节点没有考虑到 双指针的再度运用(其中,对于removeBadVolume中的if(slow!=0)时的操作逻辑要特别注意和学习,改成注释那样会多空格,只slow++会出现错误,eg“空格空格hello空格world空格空格”会错误输出为“hellolworld”)
class Solution {
public :
void reverseString ( string & s, int l, int r) {
for ( int i = l, j = r; i < j; i++ , j-- ) {
swap ( s[ i] , s[ j] ) ;
}
}
void removeBadVolume ( string & s) {
int slow = 0 ;
for ( int fast = 0 ; fast < s. size ( ) ; fast++ ) {
if ( s[ fast] != ' ' ) {
if ( slow != 0 ) {
s[ slow++ ] = ' ' ;
}
while ( fast < s. size ( ) && s[ fast] != ' ' ) {
s[ slow++ ] = s[ fast++ ] ;
}
}
}
s. resize ( slow) ;
}
string reverseWords ( string & s) {
removeBadVolume ( s) ;
reverseString ( s, 0 , s. size ( ) - 1 ) ;
int l = 0 , r = s. size ( ) - 1 ;
for ( int i = 0 ; i <= s. size ( ) ; i++ ) {
if ( i == s. size ( ) || s[ i] == ' ' ) {
r = i - 1 ;
reverseString ( s, l, r) ;
l = r + 2 ;
}
}
return s;
}
} ;
kama55.右旋字符串
思路并不难 随想录增设了如下条件:不能申请额外空间,只能在本串上操作。是对以往思路的重新复习:整体翻转,再局部翻转 常规
# include <iostream>
# include <string>
using namespace std;
int main ( ) {
string s, str;
int k;
cin>> k>> s;
for ( int i = s. size ( ) - k; i < s. size ( ) ; i++ ) {
str += s[ i] ;
}
s. resize ( s. size ( ) - k) ;
s = str + s;
cout<< s;
}
# include <iostream>
# include <algorithm>
using namespace std;
int main ( ) {
int n;
string s;
cin >> n;
cin >> s;
int len = s. size ( ) ;
reverse ( s. begin ( ) , s. end ( ) ) ;
reverse ( s. begin ( ) , s. begin ( ) + n) ;
reverse ( s. begin ( ) + n, s. end ( ) ) ;
cout << s << endl;
}