翻转单词顺序列

写在前面

剑指offer: 翻转单词顺序列

题目要求

牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

解法

方案1:

class Solution {
public:
    string ReverseSentence(string str) {
        int n = str.size();
        if(n<=1) return str;
        string res,temp;
        for(int i=0;i<n;++i) {
            if(str[i]==' ') {
                if(res.size())
                    res = temp + ' ' + res;
                else res = temp;
                temp.clear();
            }
            else {
                temp.push_back(str[i]);
            }
        }
        if(res.size()) res = temp + ' ' + res;
        else res = temp;
        if(res.size()<n) return str;
        else return res;
    }
};

分析:我的思路是使用一个temp保存当前得到的单词,当当前的是元素是字符就push_back到temp当中,当当前的元素是空格就将temp添加到res前面:res = temp + ’ ’ + res。最后还需要注意特殊的输入,输入为空,或者输入全为空格的情况。

时间复杂度为O(n) 空间复杂度为o(n)。由于使用新的string保存反转过程当中的中间结果所以有了额外的空间开销。

方案2:
采用就地反转的方式,不使用额外的空间。

class Solution {
public:
    string ReverseSentence(string str) {
        int n = str.size();
        if(n<=1) return str;
        reverse(str,0,n-1);
        int l = 0,r = 0;
        while(l<n) {
            if(str[l]==' ') {
                ++l;
                ++r;
            }
            else {
                while(str[r]!=' '&&r<n)//防止越界操作
                    ++r;
                reverse(str,l,r-1);
                l = r+1;
                r = l;
            }
        }
        return str;
    }

    void reverse(string& str,int l,int r) {
        if(r-l<=0) return;
        while(l<r) {
            char temp = str[l];
            str[l] = str[r];
            str[r] = temp;
            ++l;
            --r;
        }
    }
};

分析:使用reverse就地反转字符串,第一次将字符串整个反转一遍,第二次将每个单词反转一次。

在C语言中,要实现输入一个英文句子并反转单词顺序的功能,可以按照以下步骤操作: 1. 首先,你需要读取用户的输入,这通常通过`scanf`函数完成,例如 `%s`用于读取字符串。 2. 然后,对字符串进行处理。由于C语言原生并不支持内置的字符串反转,你可以创建两个指针,一个指向开始位置(通常是原始字符串),另一个从后向前遍历字符串。 3. 当找到一个空格或者到达字符串结尾时,说明找到了一个完整的单词,此时交换这两个指针所指向的字符,并将指针向中间移动。 4. 继续这个过程,直到两个指针相遇,整个字符串就翻转单词顺序。 5. 最后,记得打印出结果。 下面是一个简单的示例代码片段: ```c #include <stdio.h> #include <string.h> void reverseWords(char* str) { int start = 0; for (int end = 0; str[end] != '\0'; end++) { // 遍历到字符串结束 if (str[end] == ' ') { // 找到单词边界 char temp = str[start]; str[start++] = str[end]; // 交换单词首尾字符 str[end] = temp; } } // 如果最后一个单词没有空格,则需要单独处理 if (start < end) str[start] = '\0'; } int main() { char sentence[1000]; printf("Enter a sentence in English: "); fgets(sentence, sizeof(sentence), stdin); // 读取整行输入 sentence[strlen(sentence) - 1] = '\0'; // 去除换行符 reverseWords(sentence); printf("Reversed words: %s\n", sentence); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值