剑指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);
}
posted @   epiphanyy  阅读(6)  评论(0编辑  收藏  举报  
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示