剑指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;
}


目录
相关文章
|
3月前
|
C++
剑指 Offer 58 - I:翻转单词顺序(c++字符串常用处理方法)
剑指 Offer 58 - I:翻转单词顺序(c++字符串常用处理方法)
23 0
|
4月前
|
Java
【剑指offer】-翻转单词序列-40/67
【剑指offer】-翻转单词序列-40/67
|
4月前
剑指Offer LeetCode 面试题58 - I. 翻转单词顺序
剑指Offer LeetCode 面试题58 - I. 翻转单词顺序
20 0
|
10月前
剑指offer 65. 翻转单词顺序
剑指offer 65. 翻转单词顺序
33 0
剑指 Offer 58 - I. 翻转单词顺序
剑指 Offer 58 - I. 翻转单词顺序
49 0
剑指 Offer 58 - I. 翻转单词顺序
翻转单词顺序(简单难度)
翻转单词顺序(简单难度)
51 0
翻转单词顺序(简单难度)
翻转单词顺序
翻转单词顺序
81 0
|
算法 Java 编译器
【算法】最后一个单词的长度,颠倒二进制位,排列序列等三道算法题目
最后一个单词的长度,颠倒二进制位,排列序列等三道算法题目
42 0
7-59 翻转单词顺序 (20 分)
7-59 翻转单词顺序 (20 分)
54 0
|
机器学习/深度学习
跟我打卡LeetCode 58最后一个单词长度&59螺旋矩阵Ⅱ&60排列序列
给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。 如果不存在最后一个单词,请返回 0 。 说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。
71 0
跟我打卡LeetCode 58最后一个单词长度&59螺旋矩阵Ⅱ&60排列序列