• lintcode-->翻转字符串


    给定一个字符串,逐个翻转字符串中的每个单词。

    说明
    • 单词的构成:无空格字母构成一个单词
    • 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
    • 如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个

    方法1:从后往前依次遍历源字符串src,每次遍历完一个单词后,直接将该单词整个拷贝到另一个字符串dst中,依次遍历原字符串,分别将每个独立的单词拷贝到dst中。

    在拷贝字符串是先判断该字符串是否全是空格如果是则不拷贝。

    实现:

    
    
    class Solution {
    public:
        /*
         * @param s: A string
         * @return: A string
         */
         
    void *reverse(char *src, char *dst)  
    {  
        char *p1, *p2;  
        if(src == NULL || dst == NULL)  
        {  
            return NULL;  
        }  
        //从src的最后一个字符开始遍历  
        p1 = src + strlen(src) - 1;  
        p2 = p1;  
        while (p1 != src)  
        {  
            if (*p1 == ' ')  
            {  
                int len = p2 - p1;//单词的长度 
                
                memcpy(dst, p1 + 1, len);  
                //每个单词的末尾加上一个空格  
                dst += len;  
                if(len>0)
                    *dst++ = ' ';
     
                p1--;  
                p2 = p1;  
            }  
            else  
            {  
                //不断将p1向前移动  
                p1--;  
            }  
        }  
        //最后一次拷贝单词  
        int len = p2 - p1 + 1;  
        memcpy(dst, p1, len);  
        dst += len;  
        *dst++ ='';  
          
    }  
         
        string reverseWords(string &s) {
            int i;
            int j;
            string cstr;
            char *str=(char*)calloc(1,s.length());
             char *dst=(char*)calloc(1,s.length());
            memcpy(str,s.c_str(),s.length());
            
            if(s.length()==0)
            return cstr.append("");
            
            reverse(str,dst);
          
            return cstr.append(dst);
        }
    };
    
    
    
    
    

     方法2:先将每个单词分成独立的几部分,然后分别对它们进行翻转,返回将整个字符串进行翻转

     实现:

     1 class Solution {
     2 public:
     3     /*
     4      * @param s: A string
     5      * @return: A string
     6      */
     7      
     8 void reverse(char *str, int low, int hight) {
     9     while (low < hight) {
    10         int temp;
    11         temp = str[hight];
    12         str[hight] = str[low];
    13         str[low] = temp;
    14         low++;
    15         hight--;
    16     }
    17 }
    18 
    19 void space(char *str)
    20 {
    21     int i=0;
    22     int j=0;
    23     char *s=str;
    24 
    25     //去掉字符串头部的空格
    26     while(str[i]!='')
    27     {
    28         if(str[i]!=' ')
    29             break;
    30         i++;
    31     }
    32 
    33 
    34     while(str[i]!='')
    35     {
    36         if(str[i]==' ')
    37         {
    38             s[j]=str[i];
    39             while(str[i]==' ')
    40                 i++;
    41             j++;
    42         }else
    43         {
    44             s[j]=str[i];
    45             i++;
    46             j++;
    47         }
    48     }
    49     s[j]='';
    50 } 
    51      
    52 string reverseWords(string &s) {
    53         int i;
    54         int j;
    55         string cstr;
    56         char *str=(char*)calloc(1,s.length());
    57         memcpy(str,s.c_str(),s.length());
    58         int len = strlen(str);
    59         int num = 0;
    60 
    61         for (int i = 0; i <= len; i++) {
    62            if (*(str + i) == ' ' || *(str + i) == '') {
    63                 reverse(str, i - num, i - 1);
    64                 num = 0;
    65             } else {
    66                 num++;
    67             }
    68         }
    69         reverse(str, 0, len - 1);
    70         space(str);
    71          
    72         return cstr.append(str);
    73     }
    74 };
  • 相关阅读:
    Phoenix SQL总结
    awk基本用法
    集群性能调优-速度篇
    集群基准性能测试
    服务器基础环境搭建
    kafka命令行操作
    九、spring boot--JPA实现分页和枚举转换
    八、spring boot--mybatis框架实现分页和枚举转换
    七、spring boot开发web应用--mybatis-plus框架实现分页和枚举转换
    六、spring boot开发web应用--mybatis-plus为简化而生
  • 原文地址:https://www.cnblogs.com/zgq0/p/8022666.html
Copyright © 2020-2023  润新知