对于直接就能使用库函数解决的问题就好不要使用,锻炼自己的编程能力
344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[ ] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 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" ]
class Solution1 {
public :
void reverseString ( vector< char > & s) {
int b= 0 ;
int e= s. size ( ) - 1 ;
while ( b< e) {
char tmp= s[ b] ;
s[ b] = s[ e] ;
s[ e] = tmp;
b++ ;
e-- ;
}
}
} ;
class Solution2 {
public :
void reverseString ( vector< char > & s) {
reverse ( s. begin ( ) , s. end ( ) ) ;
}
} ;
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. 反转字符串 II
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg" , k = 2
输出: "bacdfeg"
提示:
该字符串只包含小写英文字母。
给定字符串的长度和 k 在 [ 1, 10000] 范围内。
class Solution {
public :
string reverseStr ( string s, int k) {
for ( int i= 0 ; i< s. size ( ) ; i+ = 2 * k) {
if ( s. size ( ) - i>= k) {
reverse ( s. begin ( ) + i, s. begin ( ) + i+ k) ;
continue ;
}
else
reverse ( s. begin ( ) + i, s. begin ( ) + s. size ( ) ) ;
}
return s;
}
} ;
考察字符串操作的好题
151. 翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶:
请选用 C 语言的用户尝试使用 O( 1) 额外空间复杂度的原地解法。
class Solution {
public :
string reverseWords ( string s) {
reverse ( s. begin ( ) , s. end ( ) ) ;
int n = s. size ( ) ;
int idx = 0 ;
for ( int start = 0 ; start < n; ++ start) {
if ( s[ start] != ' ' ) {
if ( idx != 0 ) s[ idx++ ] = ' ' ;
int end = start;
while ( end < n && s[ end] != ' ' ) s[ idx++ ] = s[ end++ ] ;
reverse ( s. begin ( ) + idx - ( end - start) , s. begin ( ) + idx) ;
start = end;
}
}
s. erase ( s. begin ( ) + idx, s. end ( ) ) ;
return s;
}
} ;
很多数组填充类的问题,然后可以预先给数组拓容带填充后的大小,然后从前向后操作
剑指 Offer 05. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20" 。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."
限制:
0 <= s 的长度 <= 10000
class Solution {
public :
string replaceSpace ( string s) {
int presize= s. size ( ) ;
if ( presize== 0 ) return "" ;
int count= 0 ;
for ( auto c: s) {
if ( c== ' ' )
count++ ;
}
s. resize ( presize+ count* 2 ) ;
int nowsize= s. size ( ) ;
int low= presize- 1 ;
int high= nowsize- 1 ;
while ( low>= 0 ) {
if ( s[ low] == ' ' ) {
s[ high] = '0' ;
s[ high- 1 ] = '2' ;
s[ high- 2 ] = '%' ;
high= high- 2 ;
}
else {
s[ high] = s[ low] ;
}
high-- ;
low-- ;
}
return s;
}
} ;
一开始想的太简单以为把所有字符串转换为数字再排序就好,但是数字不能拆开
179. 最大数
给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。
示例 1:
输入: [ 10,2]
输出: 210
示例 2:
输入: [ 3,30,34,5,9]
输出: 9534330
说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。
class Solution {
static bool cmp ( string a, string b) {
return stoll ( a+ b) > stoll ( b+ a) ;
}
public :
string largestNumber ( vector< int > & nums) {
if ( ! nums. size ( ) ) return "" ;
string res;
vector< string> vec;
for ( auto i: nums) {
string tmp= to_string ( i) ;
vec. push_back ( tmp) ;
}
sort ( vec. begin ( ) , vec. end ( ) , cmp) ;
for ( auto s: vec)
res. append ( s) ;
return res[ 0 ] == '0' ? "0" : res;
}
} ;