• 字符串的逆序之旅


    这两天在看《编程珠玑》,第一章就收获非常的多,真的挺后悔现在才看着本书,第二章有个将字符串逆序的例子,就是比如“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) 
  • 相关阅读:
    vue 中的键盘事件
    红米k40刷类原生系统
    (历史) 1960s,大家争先在共享内存上实现原子性 (互斥) 但几乎所有的实现都是错的,直到 Dekker's Algorithm,还只能保证两个线程的互斥
    Go Memory Model 内存模型 同步 goroutine
    理解并发程序执行 (Peterson算法、模型检验与软件自动化工具
    源码 连接池 设计
    Thread Exception Captured Application Crash Report
    Check if the context is expired.
    A Quick Guide to Go's Assembler
    敏感问题调查 干扰变量 抛硬币
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2432387.html
Copyright © 2020-2023  润新知