开发者社区> sjf0115> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

剑指Offer之翻转单词顺序

简介:
+关注继续查看

题目描述:
JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
输入:
每个测试案例为一行,表示一句英文句子。
我们保证一个句子的单词数不会超过600,每个单词的长度也不会超过30。但是需要注意的是Fish是个不拘小节的人,有时候两个单词中间可能会有很多空格。为了方便起见,你可以认为一行的字符总数不会超过50000个,标点符号可以和普通字母一样处理。
输出:
对应每个测试案例,把翻转后的正确的句子单独输出一行。
样例输入:
student. a am I
I'm a Freshman and I like JOBDU!
样例输出:
I am a student.
JOBDU! like I and Freshman a I'm

【解析】


【代码】

/*********************************
*   日期:2013-11-29
*   作者:SJF0115
*   题号: 题目1361:翻转单词顺序
*   来源:http://ac.jobdu.com/problem.php?pid=1361
*   结果:AC
*   来源:剑指Offer
*   总结:
**********************************/
#include <stdio.h>
#include <malloc.h>
#include <string.h>

char *words;

//反转单词
void ReverseWord(char* words,int begin,int end){
    int temp;
    if(words == NULL || begin > end || begin < 0){
        return;
    }
    //反转
    while(begin < end){
        temp = words[begin];
        words[begin] = words[end];
        words[end] = temp;
        begin ++;
        end --;
    }
}

char* Reverse(char *words){
    int i;
    if(words == NULL){
        return NULL;
    }
    int len = strlen(words);
    //反转整个句子
    ReverseWord(words,0,len-1);
    //逐个反转单词
    int begin = 0,end = 0,isFirst = 0;//begin 单词第一个字母下标 end 单词最后一个字母下标isFirst 判断是不是单词后第一个空格
    for(i = 0;i <= len;i++){
        //空格
        if(isFirst == 0 && words[i] == ' '){
            begin = end = i+1;
        }
        //单词后第一个空格或者一个句子的结束
        else if((isFirst == 1 && words[i] == ' ')|| words[i] == '\0'){
            ReverseWord(words,begin,end);
            begin = end = i+1;
            isFirst = 0;
        }
        //单词
        else{
            end = i;
            isFirst = 1;
        }
    }
    return words;
}


int main() {
    int i,n;
    words = (char*)malloc(sizeof(char)*50001);
    while(gets(words)){
        words = Reverse(words);
        for(i = 0;i < strlen(words);i++){
            printf("%c",words[i]);
        }
        printf("\n");
    }//while
    return 0;
}


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
翻转单词顺序
翻转单词顺序
11 0
《剑指offer》之“翻转单链表”递归、迭代、双指针解题
《剑指offer》之“翻转单链表”递归、迭代、双指针解题
27 0
剑指Offer——I.翻转单词顺序(JS实现)
剑指Offer——I.翻转单词顺序(JS实现)
53 0
剑指offer之快速排序
剑指offer之快速排序
70 0
[剑指offer] 反转链表
题目描述 输入一个链表,反转链表后,输出新链表的表头。 解题思路 设置三个指针,head为当前节点,pre为当前节点的前一个节点,next为当前节点的下一个节点,需要pre和next的目的是让当前节点从pre->head->next1->next2变成...
884 0
单词翻转
总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个句子(一行),将句子中的每一个单词翻转后输出。 输入 只有一行,为一个字符串,不超过500个字符。单词之间以空格隔开。 输出 翻转每一个单词后的字符串,单词之间的空格需与原文一致。
1232 0
《剑指offer》-反转链表
输入一个链表,反转链表后,输出链表的所有元素。 题目考察链表反转,但是挖坑不是反转本身,而是题目的描述再次不清晰:什么叫“反转链表后输出链表所有元素”?给的代码框架只有一个函数ReverseList,返回值类型是ListNode*,输出不输出和我有什么关系? class Solution{ publ...
702 0
翻转句子中单词的顺序
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。 例如输入“I am a student.”,则输出“student. a am I”。
580 0
+关注
sjf0115
Stay Hungry, Stay Foolish---我们必须用谦虚者的自觉,饥饿者的渴望的求职态度,来拥抱我们的未来。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载