总结的部分题目思路与代码,待完善。
【剑指offer-第二版】部分题目与解答【C++版本】
题目一:
翻转单词顺序
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student.”,则输出“student. a am I”。
解题思路:
1.第一步翻转句子中的所有字符,例如“I am a student.”翻转为“.tneduts a ma I”,第二部再翻转每个单词中的字符,得到最后的结果。
2.这个题目可以使用一个函数来进行句子/单词的翻转,在主函数中调用这个翻转函数首先进行整个句子的翻转然后对每个单词进行翻转。
可以AC的解法【C++版本】
#include <iostream>
#include <string>
using namespace std;
string ReverseSentence(string str);
void ReverseStr(string &str);
int main() {
string str = "this is a test string.";
cout << ReverseSentence(str) << endl;
system("pause");
return 0;
}
//首先进行整句的翻转,然后进行单个单词的翻转
string ReverseSentence(string str) {
if (str.size() <= 1)return str;
string resu;
//首先进行整句的翻转
ReverseStr(str);
int low = 0;
//进行单词的翻转,每找到一个空格说明找到了一个单词,此时取出该单词进行翻转,并将结果添加到resu的后面
for (int i = 0; i != str.size(); i++) {
if (str[i] == ' ') {
string tmp = str.substr(low, i-low);
ReverseStr(tmp);
resu += tmp;
resu += " ";
low = i+1;
}
}
string tmp = str.substr(low, str.size());
ReverseStr(tmp);
resu += tmp;
return resu;
}
//专门进行翻转的函数
void ReverseStr(string &str) {
if (str.size() <= 1)return;
int low = 0, high = str.size() - 1;
while (low < high) {
char tmp = str[low];
str[low] = str[high];
str[high] = tmp;
low++;
high--;
}
}
题目二:
左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串“abcdefg”和数字2,该函数将返回字符串左旋转两位的结果“cdefgab”。
解题思路:
1.这个题目是题目一的一个衍生。
2.注意给出的例子,如果我们先翻转整个字符串“abcdefg”将会得到“gfedcba”,然后我们把前面5个字符和后面两个字符分别进行翻转,就能够得到想要的结果。
3.注意交换顺序也可以得到正确的结果,即先对前5个字符和后两个字符分别进行翻转,再进行一次整体的翻转。
可以AC的解法【C++版本】
#include <iostream>
#include <string>
using namespace std;
string ReverseSentence(string str);
void ReverseStr(string &str);
string LeftRotateString(string str, int n);
int main() {
string str1 = "abcdefg";
cout << LeftRotateString(str1, 2) << endl;
system("pause");
return 0;
}
string LeftRotateString(string str, int n) {
if (str.size() <= 1 || (n%str.size() == 0))return str;
string resu = "";
n = n % str.size();
//对整个字符串进行一次翻转
ReverseStr(str);
//翻转前面size-n个字符
string str1 = str.substr(0, str.size() - n);
ReverseStr(str1);
resu += str1;
//翻转后面n个字符
string str2 = str.substr(str.size() - n, n);
ReverseStr(str2);
resu += str2;
return resu;
}
//这个翻转函数和问题一的一样
void ReverseStr(string &str) {
if (str.size() <= 1)return;
int low = 0, high = str.size() - 1;
while (low < high) {
char tmp = str[low];
str[low] = str[high];
str[high] = tmp;
low++;
high--;
}
}