c和python解决各种字符串反转问题的不同思路

  问题1:反转字符串,从头到尾反转整个字符串,就像在镜子中看到的反转。

  输入:Hello World

  输出:dlroW olleH

  这个问题比较简单一些,主要是设置两个指针分别指向头尾,依次交换直到相遇。

 1 #include <stdio.h>
 2 void reverseString(char *p);
 3 int main()
 4 {    
 5     char str[]="Hello World";
 6     reverseString(str);
 7     printf("%s",str);
 8     return 0;
 9 }
10 void reverseString(char *p)
11 {
12     char *pEnd = p;
13     for (; *pEnd!='\0'; pEnd++);
14     --pEnd;
15 
16     char temp;
17     for (; p < pEnd; ++p, --pEnd)
18     {
19         temp = *p;
20         *p = *pEnd;
21         *pEnd = temp;
22     }
23 }

  python的实现有多种方法,可以直接s[::-1];也可以利用reduce(lambda x,y:y+x,s)。

  当然也可以转化为列表再反转,然后再转化我字符串:

1 def reverse_str(s):
2     ls=list(s)
3     ls.reverse()
4     str="".join(ls)
5     return str

问题2:字符串中以空格隔开的单词反转,但是整个字符串不反转。

  输入:hello world

  输出:olleh dlrow

 1 #include <stdio.h>
 2 void reverseword(char *p);
 3 void reverse(char *pStart, char *pEnd);
 4 int main()
 5 {    
 6     char str[]=" Hello World";
 7     reverseword(str);
 8     printf("%s",str);
 9     return 0;
10 }
11 void reverseword(char* p)
12 {
13     char *p1 = p;
14     while (*p1 != '\0')
15     {
16         // Skip all blank characters.
17         for (; *p1==' '; p1++) ;
18 
19         char *p2 = p1;
20 
21         // Let p2 points to the end of the current word.
22         for (; *p2!=' ' && *p2!='\0'; p2++);
23         --p2;
24 
25         // Reverse the current word.
26         reverse(p1, p2);
27 
28         ++p2;
29         p1 = p2;
30     }
31 }
32 void reverse(char *pStart, char *pEnd)
33 {
34     for (; pStart < pEnd; ++pStart, --pEnd)
35     {
36         char temp = *pStart;
37         *pStart = *pEnd;
38         *pEnd = temp;
39     }
40 }

  python的实现(暂时只想到一个复杂的做法)(后来证明这个解法有很大缺陷):

 1 def reverse_str(s):
 2     ls=list(s)
 3     flag=[]
 4     for i in range(len(ls)):
 5         if ls[i]!=' ':
 6             flag.append(i)
 7     
 8     loc=[]
 9     for i in range(len(flag)):
10         if flag[i-1]!=flag[i]-1:
11             if i==0:
12                 loc.append(i)
13                 loc.append(len(flag)-1)
14             else :
15                 loc.append(i-1)
16                 loc.append(i)
17     loc.append(loc[1])
18     del loc[1]
19     
20     newloc=[]
21     for i in loc:
22         newloc.append(flag[i])
23         
24     for i in range(0,len(newloc),2):
25         newword=ls[newloc[i]:newloc[i+1]+1]
26         newword.reverse()
27         ls[newloc[i]:newloc[i+1]+1]=newword
28         
29     ls=''.join(ls)
30     print ls
31 if __name__=='__main__':
32     s="  Hello   W orld  "
33     reverse_str(s)   

  上面的解法肯定有问题,后来想一想是因为对python的用法不熟悉,还是用c/c++的思路来解决问题。接着想出了python思考方式的解决方法。

  下面是解法:

 1 def reverse_str(s):
 2     ls=s.split(' ')
 3     newls=[]
 4     for c in ls:
 5         list(c).reverse()
 6         newls.append(c)  
 7     newstr=' '.join(newls)
 8     print newstr
 9 if __name__=='__main__':
10     s="  Hello     g W orld  "
11     reverse_str(s)

  问题3:反转字符串中单词次序,单词本身不反转

  输入:hello world

  输出:world hello

 1 void reverseWords(char *s)
 2 {
 3     char *word_begin = NULL;
 4     char *temp = s; /* temp is for word boundry */
 5  
 6     /*STEP 1 of the above algorithm */
 7     while( *temp )
 8     {
 9         /*This condition is to make sure that the string start with
10           valid character (not space) only*/
11         if (( word_begin == NULL ) && (*temp != ' ') )
12         {
13             word_begin=temp;
14         }
15         if(word_begin && ((*(temp+1) == ' ') || (*(temp+1) == '\0')))
16         {
17             reverse(word_begin, temp);
18             word_begin = NULL;
19         }
20         temp++;
21     } /* End of while */
22  
23     /*STEP 2 of the above algorithm */
24     reverse(s, temp-1);
25 }

  python中的简单实现(由于这种python解法没有考虑空格,所以较为简单):

str = ' '.join(s.split( )[::-1]) 

 

 

posted @ 2013-06-29 14:15  lkprof  阅读(386)  评论(0编辑  收藏  举报