面试题42:翻转单词顺序VS左旋转字符串
2015-07-07 15:23
501 查看
题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。
例如输入字符串“I am a student.",则输出"student. a am I"。
解法一:利用字符串流分割单词
解法二:先翻转整个句子,再翻转句子中的单词
题目二:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串
"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。
分析:题目二与题目一相似,同样可以通过翻转字符串的办法来解决。以"abcdefg"为例,我们可以将它分为两部分。由于想把它的前两个字符移到后面,我们就把前两个字符分成第一部分,把后面的字符分成第二部分。我们先分别翻转这两部分,于是就得到”bagfedc”,再翻转整个字符串就可以得到"cdefgab",刚好就是字符串左旋转两位的结果。
例如输入字符串“I am a student.",则输出"student. a am I"。
解法一:利用字符串流分割单词
void reverseWords(string &s) { istringstream sstr(s); s = ""; string str; while (sstr>>str) s = str + ' ' + s; if (!s.empty())//删除最后一个多余的空格 s.erase(s.end()-1); }
解法二:先翻转整个句子,再翻转句子中的单词
void reverse(string&s, int left, int right) {//翻转字符串s的一个子字符串 while(left < right) { char temp = s[left]; s[left] = s[right]; s[right] = temp; left++; right--; } } void reverseSentence(string&s) { if (s.empty()) return ; int left = 0; int right = s.size()-1; reverse(s, left,right); left = 0; right = 0; while (left!=s.size()) { if (s[left]==' ') { left++; right++; } else if (s[right]==' ' || right == s.size()) { reverse(s,left,right-1); left = right; } else { right++; } } }
题目二:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串
"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。
分析:题目二与题目一相似,同样可以通过翻转字符串的办法来解决。以"abcdefg"为例,我们可以将它分为两部分。由于想把它的前两个字符移到后面,我们就把前两个字符分成第一部分,把后面的字符分成第二部分。我们先分别翻转这两部分,于是就得到”bagfedc”,再翻转整个字符串就可以得到"cdefgab",刚好就是字符串左旋转两位的结果。
void leftRotateString(string&s, int n) { int length = s.size(); if (length == 0 || n < 0) return; n = n%length; reverse(s,0,n-1); reverse(s,n,s.size()-1); reverse(s,0,s.size()-1); }
相关文章推荐
- (剑指Offer)面试题7:用两个栈实现队列
- 程序员都必须遵守的编程原则(仅供参考)
- 这些年,我们遇到过的奇葩面试官
- 10个球问题(面试题)
- 求职前期,入门
- 求职前期,入门
- 一些sql面试题
- 15个程序员需要知道的Chrome扩展
- Java常用排序算法/程序员必须掌握的8大排序算法
- 黑马程序员——Java基础二
- 黑马程序员—Java面向对象
- 技术面试题目汇总
- Java程序员们最常犯的10个错误
- (转)informatica 面试题大全
- 阿里面试题
- 黑马程序员——Java面向对象-整理笔记
- iOS-知乎上面面试iOS的问题
- 要不要为了高薪而放弃职业规划?
- 黑马程序员—Java入门及Java语言基础组成
- php 面试例子举例