zoukankan      html  css  js  c++  java
  • 反转单词顺序

      这曾经是一个面试题,将一行英文句子单词顺序反转,如输入"feng i love you!",输出为"you! love i feng",标点符号当做普通字符处理,这个题目可以在九度上在线提交http://ac.jobdu.com/problem.php?cid=1039&pid=25

      这里提供一个简单的思路,先将整个英文句子对称反转,"abc de"反转成"ed cba",再将其中的每个单词对称反转一次得到"de abc",时间复杂度o(n),空间复杂度o(1)。下面证明一下为什么这样两次反转后能实现单词顺序的反转,假设该句子为s1="AB...CD"(其中A、B、C、D代表单词),经过一次整体对称反转后,句子变为s2="D'C'...B'A'"(其中的A'、B'、C'、D'分别代表ABCD的反转。再对每个单词反转得到s3="DC...BA",实现反转的目的。

      上代码,在九度上AC.

    #include<stdio.h>
    #include<string.h>
    #define MAXLENGHT 50000
    void printString(char *ch);
    /*
    *    对称交换字符串ch的low到high之间的字符
    */
    char* reverse(char *ch,int low,int high){
        for(int i=low;i<low+(high-low)/2;i++){
            char temp = *(ch+i);
            *(ch+i)=*(ch+low+high-1-i);
            *(ch+low+high-1-i)=temp;
                printString(ch);
                printf("\n");
        }
        return ch;
    }
    
    int main(){
        char chArray[MAXLENGHT];
        char* ch = chArray;
        while(gets(ch)!=NULL){
            int length = strlen(ch);
            ch = reverse(ch,0,length);//整体进行对称交换
            int low = 0;
            int high = 0;
            while(high <= length - 1){//对每一个单词进行交换
                while(*(ch+high) != ' ' && high <= length - 1){
                    high++;
                }
                ch = reverse(ch,low,high);            
                high++;
                low = high;        
            }
            printString(ch);
        }
        return 0;
    }
    void printString(char *ch){//打印字符串
        int length = strlen(ch);
        for(int i=0;i<length;i++){
                printf("%c",*(ch+i));
            }    
    }
  • 相关阅读:
    Python
    Kubernetes之二workload资源编排
    Kubernetes之一安装
    DockerFile
    Docker的安装和使用
    Elastic Stack配置和使用
    虚拟化KVM应用
    Tomcat安装和使用
    Keepalived实现双主模型的ipvs高可用集群+实现双主模型的nginx高可用集群
    实验lvs+dns+nfs+mysql+web
  • 原文地址:https://www.cnblogs.com/fengfenggirl/p/2934290.html
Copyright © 2011-2022 走看看