字符串的逆序之旅

这两天在看《编程珠玑》,第一章就收获非常的多,真的挺后悔现在才看着本书,第二章有个将字符串逆序的例子,就是比如“this is a string”变成“string a is this”,那么今天就总结一下这个逆序字符串的小专题。

       首先假设有人问你:如何将“this is a string”完全逆序,也就是gnirts a si siht

       方案一:申请一个同样大小的空间,直接逆序将字符串保存一遍。                                                                            


 

       这是我们最容易想到的一种方法,我们只需要找到字符串尾指针就好了,下面就是一段简单的代码:

        字符串的逆序之旅

        这个代码的关键是找准字符串尾的位置,(每一个字符串以‘\0’结尾)

   

        那么,现在我们的问题增加了,再开一个n,空间太大了,我们必须减少空间。。。

        方案二:其实仔细观察就会发现,逆序其实就是不断的首尾交换,比如abcde首先是a和e进行交换,接着是b和d交换,这样以此类推n/2次交换就可以完成任务了,这个的远离其实就是我们早就会的轴对称。


 

       字符串的逆序之旅

        写这个方法的时候,我曾经犯的错误就是把right-- 写成了right++,结果悲剧的段错误就出现了,希望大家不要有这样低级的失误。

    

        现在问题又的苛刻了,干脆不允许我们用临时变量了,该如何使字符串逆序,这个时候

        方案三:有没有想起以前有一个经典的问题就是,如何不经过临时变量如何交换两个整数,那就是经典的;


 

        a = a + b;

        b = a - b;  //此时 b = a

        a = a - b ; //此时 a = b         

        其实我们还可以使用一个渐渐被我们遗忘的操作符,那就是异或^,补一点小知识,两个数异或,比如1101和1001,相同位为0,不同位为1,则结果为0100,所以任何数和0异或的结果都是其本身,一个数和自身异或的结果就是0.

        于是上面的代码其实也可以这样来写

       a = a ^ b;

       b = a ^ b;

       a = a ^ b;            哈哈,是不是感觉非常的棒。

      有了这个思路的话,接下来实现无临时变量的交换就变得非常的简单了        

       字符串的逆序之旅

        还是那句话,注意符号。。。

 


 

       最后回归话题了,我们不是要完全的逆序,而是要求每一个单词的逆序,比如 “string a is this”,说真的第一次看这个问题就是一下子头很乱,无从下手,《编程珠玑》中的提示就是逆序的逆序,一下子就有了灵感,我们把这个字符串抽象成ABCD,我们用A~表示其逆序,这样(A~B~C~D~)~就是DBAC了。通俗的描述就是先对每一个单词求逆序,得到 siht si a gnirts,然后对整个字符串逆序,也就得到了string a is this

      

     字符串的逆序之旅

      好了,大功告成了,这样我们一步步的归纳了一下字符串逆序的种种~希望对大家有所帮助。

     

   本文源代码:https://github.com/octobershiner/Algorithm/tree/master/Reverse

 

 


 


作品octobershiner创作,采用 知识共享署名-非商业性使用 3.0 Unported许可协议进行许可。
基于 www.cnblogs.com/octobershiner上的作品创作,欢迎转载,但未经作者同意必须保留此段声明,
且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
作者是HIT童鞋一枚。
分享到: 0
摘要: 这两天在看《编程珠玑》,第一章就收获非常的多,真的挺后悔现在才看着本书,第二章有个将字符串逆序的例子,就是比如“thisisastring”变成“stringaisthis”,那么今天就总结一下这个逆序字符串的小专题。首先假设有人问你:如何将“thisisastring”完全逆序,也就是gnirtsasisiht 方案一:申请一个同样大小的空间,直接逆序将字符串保存一遍。 这是我们最容易想到的一种方法,我们只需要找到字符串尾指针就好了,下面就是一段简单的代码:这个代码的关键是找准字符串尾的位置,(每一个字符串以‘\0’... 阅读全文
posted @  2012-04-03 23:44 octobershiner 阅读(643) |  评论 (9)  编辑
 
摘要: 今天,看一位学长的博客《递归的力量》,受到的启发还是很多的,以前写递归程序,从来都没有好好想过,这里为什么要用到递归,以及什么样的情况要用到递归。引用他博文中的一句话,也是思考的一个方式:可以用递归实现的场景要满足两个条件: 第一:这个问题是否可以分解为形式相同但规模更小的问题? 第二:如果存在这样一种分解,那么这种分解是否存在一种简单情境? 有一个例子是用递归判断一个回文序列,回文大家都知道就是类似abba 或者abcba这样的序列,判断回文的基本思想也就是首尾字符是相同的,由于他的对称性,那么可以得知,这各串是可分解的。那么有没有一种简单可终止的情况,那就是剩下最后一个字符或... 阅读全文
posted @  2011-11-17 20:58 octobershiner 阅读(198) |  评论 (9) 

你可能感兴趣的:(字符串)