【剑指offer】面试题58:翻转单词顺序/左旋转字符串【C++版本】

40 篇文章 1 订阅
26 篇文章 1 订阅

总结的部分题目思路与代码,待完善。
【剑指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--;
       }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值