• LeetCode 151. 翻转字符串里的单词


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

    示例 1:

    输入: "the sky is blue"
    输出: "blue is sky the"
    

    示例 2:

    输入: "  hello world!  "
    输出: "world! hello"
    解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
    

    示例 3:

    输入: "a good   example"
    输出: "example good a"
    解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
    

    说明:

    • 无空格字符构成一个单词。
    • 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
    • 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

    进阶:

    请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。

    思路:这道题可以使用栈来解决,同样也可以不使用栈来解决,至于用哪种,嗯。。还得看怎么选择。这道题的题目不难理解,难就难在处理特殊情况,下面,给大家展示两组代码。

    (1)没有使用栈的:

     1 char * reverseWords(char * s){
     2     int i,j,k=0,flag=0,count=0;
     3     for(i=0;i<strlen(s);i++){
     4         if(s[i]==' '){
     5             count++;
     6         }
     7     }
     8     if(count==0){
     9         return s;
    10     }
    11     if(count==strlen(s)||strlen(s)==0){
    12         s[0]='';
    13         return s;
    14     }
    15     if(strlen(s)==1){
    16         return s;
    17     }
    18     char* sr;
    19     sr=(char*)malloc((strlen(s)+1)*sizeof(char));
    20     for(i=strlen(s)-1;s[i]==' ';i--);
    21     for(;i>=0;i--){
    22         if(s[i]==' '){
    23             flag++;
    24         }else{
    25             flag=0;
    26         }
    27         if(flag==1){
    28             for(j=i+1;s[j]!=' '&&s[j]!='';j++){
    29                 sr[k++]=s[j];
    30             }
    31             sr[k++]=' ';
    32         }
    33     }
    34     if(s[0]==' '){
    35         for(i=k;sr[k]==' ';i--);
    36         sr[i-1]='';
    37         return sr;
    38     }
    39 
    40     for(i=k,j=0;s[j]!=' ';j++,i++){
    41         sr[i]=s[j];
    42     }
    43     sr[i]='';
    44     return sr;
    45 }

    (2)使用栈的:

     1 char * reverseWords(char * s){
     2     int len=strlen(s);
     3     if(len==0)
     4         return s;
     5     char *res=(char *)malloc(sizeof(char)*(strlen(s)+1));
     6     char *stack=(char *)malloc(sizeof(char)*(strlen(s)+1));
     7     int i,top=0,count=0,flag=0;
     8     for(i=len-1;i>=0;i--){
     9         if(s[i]!=' '){
    10             stack[top++]=s[i];
    11             flag=1;
    12         }
    13         if(s[i]==' '){
    14             while(top>0)
    15                 res[count++]=stack[--top];
    16             if(flag==1)
    17                 res[count++]=' ';
    18             flag=0;
    19         }
    20     }
    21     if(top==0){
    22         if(count>0)
    23             count--;
    24     }
    25     while(top>0)
    26         res[count++]=stack[--top];
    27     res[count]='';
    28     return res;
    29 }

    自我感觉,使用栈的要方便些,而且时间复杂度上,栈的是更占优势的。

  • 相关阅读:
    cookie和session的区别
    使用Flexible实现手淘H5页面的终端适配
    跟自己说::::
    前端稀奇古怪的问题!!!
    为什么我老是能碰见那些糟心的事?
    谈谈我的工作日常;
    毕业后,女生要到美国发展;
    工作常识总结
    git用法
    1.date对象
  • 原文地址:https://www.cnblogs.com/woju/p/12676804.html
Copyright © 2020-2023  润新知