| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1402 人关注过本帖
标题:关于反转输出字符串的问题。。
只看楼主 加入收藏
MMMMint
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2016-2-5
收藏
得分:0 
回复 10楼 杭01
.....我刚学三个月  我想说... 你写的我基本都看不懂啊啊啊啊TT
2016-02-11 23:34
拉链
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:107
专家分:534
注 册:2016-1-22
收藏
得分:0 
可以就在原字符串上反序,无需定义两个字符数组。
收到的鲜花
  • 杭012016-02-12 17:41 送鲜花  1朵   附言:这种方法是最快的,O(n/2)
2016-02-12 07:45
杭01
Rank: 3Rank: 3
来 自:广州
等 级:论坛游侠
威 望:1
帖 子:29
专家分:132
注 册:2016-2-11
收藏
得分:0 
回复 11楼 MMMMint
不好意思,我的注释有点隐晦了。
举个例子:
char *s = "abcde";
这里字符串s的值是"abcde",反序后的字符串是:
char *d = "edcba";
将它们放在一起,配上所在位置就是:
/* a b c d e

 * e d c b a

 * 0 1 2 3 4

 */
可以看到,本来处在[4]的'e'跑到了[0],本来处在[3]的'd'跑到了[1],[2]的'c'没变,[1]的'b'跑到了[3],[0]的'a'跑到了[4]
而4+0,3+1,2+2,1+3,0+4的值都是4,即strlen(s)-1。所以我们有:
d[i] = s[strlen(s)-i]
然后就可以写出程序了。

P.S.
以下是引用拉链在2016-2-12 07:45:47的发言:

可以就在原字符串上反序,无需定义两个字符数组。
这个方法更好。我的算法的时间复杂度是O(N),空间复杂度是O(N)。这个算法的时间复杂度是O(N/2),快了一倍,空间复杂度是O(0),完全不消耗空间。
我猜思路是这样的:
如果要把一个字符串s反转,可以先把它的第1位与它的倒数第1位调换,再把它的第2位与它的倒数第2位调换,……。
实现(来自网络,有修改):
程序代码:
    char* strrev(char* s) { 

        /* h指向s的头部 */
        char* h = s;
        /* t指向s的尾部 */    
        char* t = s + strlen(s); 

        char ch; 

        /* 当h和t未重合时,交换它们所指向的字符 */
        while(h < t) {
            ch = *h;
            *h++ = *t;    /* h向尾部移动 */
            *t-- = ch;    /* t向头部移动 */
        }

        return s;
    }


准备中考中,有事请Email :)

Email: huihan9 AT qq DOT com
QQ: 2672286148
cnblogs: jt2001
2016-02-12 17:58
快速回复:关于反转输出字符串的问题。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024852 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved