• 数据结构之字符串反转


    说明:有一条语句,如"Life is painting a picture, not doing a sum",要求语句中的单词左右对换,但每个单词不变,即变换后的串应该为

    "sum a doing not, picture a painting is Life"

    两种方法:

    1.分治法,将字符串变成一个单词和一个新的字符串然后对换,递归处理字符串。

    2.先整体反转,再每个单词反转,类似数组右移K位的方法

    // project1.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include<string.h>
    
    const int LENGTH=1000;
    
    //分治法
    int blank_pos(char str[],int beg,int end){
        for(int i=beg;str[i] && i<=end;i++){
            if(str[i]==' ')
                return i;
        }
        return -1;
    }
    void reverse_adjacent(char str[],int beg,int end){
        for(int i=beg,j=end;i<j;i++,j--){
            char tmp=str[i];
            str[i]=str[j];
            str[j]=tmp;
        }
    }
    
    void combine(char str[],int beg,int pos,int end){
        char tmp[LENGTH];
        //将str[pos+1..end]复制到tmp[beg..beg+end-pos-1]
        memcpy(&tmp[beg],&str[pos+1],sizeof(char)*(end-pos));
        memcpy(&tmp[beg+end-pos+1],&str[beg],sizeof(char)*(pos-beg));
        //str[beg+end-pos]=' '
        tmp[beg+end-pos]=' ';
        memcpy(&str[beg],&tmp[beg],sizeof(char)*(end-beg+1));
    }
    //分治法
    void reverse_words(char str[],int beg,int end){
        if(str==NULL || beg==end)
            return;
        int pos=blank_pos(str,beg,end);//空格位置
        if(pos!=-1 && pos>=beg && pos<=end){//存在空格
            reverse_words(str,pos+1,end);
            combine(str,beg,pos,end);
        }
    }
    //先整体反转,再每个单词反转
    void reverse_words_two(char str[],int beg,int end){
        reverse_adjacent(str,beg,end);//整体反转
        //每个单词反转
        int i=beg;
        while(i<=end){
            int start=i,ending;
            while(str[i] && str[i]!=' ')
                i++;
            ending=i-1;
            i++;//跳过空格
            if(start<ending)
                reverse_adjacent(str,start,ending);
        }
    }
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        char str1[LENGTH]=" banana apple orange ";
        char str2[LENGTH]="abcdefghij klmn ";
        char str3[LENGTH]=" 123456789 234 986 3433 9999";
        
        reverse_words_two(str1,0,strlen(str1)-1);
        reverse_words(str1,0,strlen(str1)-1);
        printf("After reverse,str=%s
    ",str1);
        reverse_words_two(str2,0,strlen(str2)-1);
        reverse_words(str2,0,strlen(str2)-1);
        printf("After reverse,str=%s
    ",str2);
        reverse_words_two(str3,0,strlen(str3)-1);
        reverse_words(str3,0,strlen(str3)-1);
        printf("After reverse,str=%s
    ",str3);
        return 0;
    }
  • 相关阅读:
    烂笔头@WP 的博文仅供自己学习的备忘录
    工具---搜索
    ubuntu---安装teamviewer和向日葵
    Ubuntu---标注工具 XXX-labelImg
    ubuntu---深度学习标注工具CasiaLabeler
    ubuntu---kazam安装
    ubuntu---notepadqq安装
    ubuntu---TeamViewer安装
    ubuntu---鼠标的乌龙事件
    ubuntu---终端下不显示 中文文字 的解决方法
  • 原文地址:https://www.cnblogs.com/abc123456789/p/3433445.html
Copyright © 2020-2023  润新知