翻转单词顺序VS左旋转字符串
2017-08-11 11:06
155 查看
题目一: 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student.”,则输出“student. a am I”。
分析:
这个问题可以分成两个过程来解决:
1.翻转整个句子,翻转结果为.tneduts a ma I
2.再将里面的每个单词翻转一次,结果为student. a am I
class Solution { public: string ReverseSentence( string str ) { string result = str; if ( str.empty() ) return str; int start = 0, end = result.size()-1; Reverse( result, start, end ); //cout << result << endl; end = start = 0; while ( start < str.size() ) { if ( result[start] == ' ' ) { start++; end++; } else if ( result[end] == ' ' || result[end] == '\0' ) { Reverse( result, start, --end ); //cout << "reverse start : " << start << "end : " << end << result << endl; start = ++end; } else { end++; } } return result; } void Reverse( string& str, int start, int end ) { if ( str.empty() ) return ; while ( start < end ) { char temp = str[start]; str[start] = str[end]; str[end] = temp; start++; end--; } } }; int main( void ) { string str = "i am a student."; Solution sos; string result = sos.ReverseSentence( str ); cout << result << endl; return 0; }
题目二: 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串“abcdefg”和数字2,该函数将返回左旋转2位得到的结果“cdefgab”。
分析:
主要有两中思路:
1.最简单,最直观的就是利用辅助数组解决,先将要旋转的前n个字符保存到一个临时辅助数组中,然后将其余字符向前移动n位,然后将辅助数组中的n个字符放置到原字符串的后n位。
2.利用题目一中的思路,先将整个字符串翻转,然后再翻转后n个字符串,再翻转前面剩下的字符串,可以实现字符串的左旋转。
思路一:辅助数组
class Solution { public: string LeftRotateString( string str, int n ) { if ( n <= 0 ) return str; if ( str.size() <= n || str.empty() ) return str; string temp( str, 0, n ); int j = 0; for ( int i = n; i < str.size(); i++, j++ ) { str[j] = str[i]; } for ( int i = 0; i < temp.size(); i++, j++ ) { str[j] = temp[i]; } return str; } }; int main( void ) { string str = "abcdefg"; Solution sos; cout << sos.LeftRotateString( str, 2 ) << endl; return 0; }
思路二:翻转
class Solution { public: string LeftRotateString( string str, int n ) { if ( n <= 0 || str.size() <= n || str.empty() ) return str; Reverse( str, 0, n-1 ); Reverse( str, n, str.size()-1 ); Reverse( str, 0, str.size()-1 ); return str; } void Reverse( string& str, int start, int end ) { if ( str.empty() ) return ; while ( start < end ) { char temp = str[start]; str[start] = str[end]; str[end] = temp; start++; end--; } } }; int main( void ) { string str = "abcdefg"; Solution sos; cout << sos.LeftRotateString( str, 2 ) << endl; return 0; }
相关文章推荐
- 翻转单词顺序VS左旋转字符串
- 面试题42:翻转单词顺序 VS 左旋转字符串
- 【剑指Offer学习】【面试题42:翻转单词顺序vs左旋转字符串】
- [剑指offer][面试题42]翻转单词顺序 VS 左旋转字符串
- 面试题42:翻转单词顺序VS左旋转字符串
- 翻转单词顺序 VS 左旋转字符串
- 剑指Offer之 - 翻转单词顺序 VS 左旋转字符串
- 剑指offer:翻转单词顺序VS左旋转字符串(java)
- 【剑指offer-Java版】42翻转单词顺序VS左旋转字符串
- 【剑指offer】题42:翻转单词顺序VS左旋转字符串
- 42.翻转单词顺序VS左旋转字符串
- 面试算法(四十二)翻转单词顺序VS左旋转字符串
- 翻转单词顺序VS左旋转字符串
- 面试题42:翻转单词顺序VS左旋转字符串
- 翻转单词顺序 VS 左旋转字符串
- 剑指Offer面试题:34.翻转单词顺序VS左旋转字符串
- 剑指offer42:翻转单词顺序 VS 左旋转字符串(更高效、简便的解法)
- 面试题42:翻转单词顺序VS左旋转字符串
- 翻转单词顺序VS左旋转字符串----->“字符串翻转”
- 剑指offer42:翻转单词顺序 VS 左旋转字符串(更高效、简便的解法)