剑指offer 学习笔记 翻转字符串

面试题58:翻转字符串。
1.输入一个英文句子,翻转句子中的单词顺序,但单词内字符的顺序不变,标点看做普通字符。如,输入"I am a student.",输出"student. a am I"。

第一步我们翻转整个句子,如上例,反转后结果为".tneduts a ma I",第二步翻转每个单词的顺序即可:

#include <iostream>
#include <string>
using namespace std;

void Reverse(string& s, int begin, int end) {
    while (begin < end) {
        swap(s[begin], s[end]);

        ++begin;
        --end;
    }
}

string& ReverseSentence(string& s) {
    if (s.size() == 0) {
        return s;
    }

    Reverse(s, 0, s.size() - 1);

    int begin = 0, end = 0;
    while (begin < s.size()) {    // 此处必须是小于而不能是!=,因为最后一次翻转后begin和end都会变为s.size()+1
        if (s[end] == ' ' || end == s.size()) {
            Reverse(s, begin, end - 1);
            begin = ++end;
        } else {
            ++end;
        }
    }

    return s;
}

int main() {
    string sentence = "I am a student.";
    cout << ReverseSentence(sentence) << endl;
}

2.字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部,实现该功能,如输入字符串"abcdefg"和数字2,将前两个字符左旋转到最后,输出"cdefgab"。

从题目1得到启发,我们可以先把输入的字符串按输入的数字进行分割,分割成前两个字符组成的字符串和剩下的字符组成的字符串,然后将这两个字符串分别翻转,结果为"bagfedc",之后再整体翻转字符串即可:

#include <iostream>
#include <string>
using namespace std;

void Reverse(string& s, int begin, int end) {
    while (begin < end) {
        swap(s[begin], s[end]);

        ++begin;
        --end;
    }
}

void LeftRotateString(string &s, int n) {
    unsigned lenOfStr = s.size();

    if (lenOfStr == 0 || n < 0 || n > lenOfStr - 1) {
        return;
    }

    if (n == 0) {    // 如翻转0个字符,相当于s没变化
        cout << s << endl;
        return;
    }

    Reverse(s, 0, n - 1);
    Reverse(s, n, lenOfStr - 1);
    Reverse(s, 0, lenOfStr - 1);

    cout << s << endl;
}

int main() {
    string s = "abcdefg";
    LeftRotateString(s, 2);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值