“设计已经达到了完美的标准不是不能再增加任何东西,而是不能再减少任何东西。” ---编程珠玑
不小心已经看到第二章,记得前言中讲到此书不要读的太快,努力解答每章后面的习题。俺们是一个不太喜太欢动脑子的人,能看懂就看,不懂就跳过,知道有此之事就Ok,混个脸熟。 如果以后遇到类似问题看能不能想的起。
问题:将一个n元一维向量向左旋转i个位置,且内存使用只在数十个字节。 刚开始一看题目就被愣住了,读了三遍第一句就没看懂,当时感觉是不是自己连语文都没过关。直到读到后面作者揭晓答案时才恍然大悟,那个激动的呀!!
我把这个问题转换成一个神奇的操作,不信你按照我写的来作:
打开一个word文档中,你输入一串字符串 123456, 你拖动鼠标选择了后面456三个字符串,按住鼠标左键不放,拖动鼠标到字符串1的前面,松开鼠标!很神奇吧!变成了新的字符串456123。
我们抛开所有拖动鼠标操作,看看这个操作核心的东西是什么,就是将456个123交换了一下位置,或看成循环移位。
按一般普通的想法,不就是一个交换吗? 把123先放到一个临时变量里,把456复制到原来123这个位置,然后再从临时变量里把123复制回来。 问题到能解决,是要求是内存使用只能在数十个字节。如果这个字符串很长.....
我按照书中教的左右互博术就能解决这个问题,太妙了。想当年只有郭靖、小龙女才能学会此法门,今天我也会了。嗯,不好,听说只有脑子反应迟钝的人才学的会呀,难道我真的很笨吗?不对,我应该是像小龙女一样心若止水,一尘不染吧!
左右互博术:先从左手大姆指开始写上1,食指写上2 ...到小指写上5, 右手小指开始写上6,....,到右手姆指写上10, 如果没有镜子,最好手指正反面都写上。 看好了1~10,ok开始。
1.预备式:气沉丹田,掌心向上,托于胸前。此时要注意看清:手指上1、2...8、9、10 十个数字。
2.左掌式:从左向右旋转左掌,手心向外,手背向内。 此时注意手指文字应该为 5、4、3、2、1、6、7、8、9、10
3.右掌式:自右向左旋转右掌,手心向外,手背向内。 此时注意手指文字应该为 5、4、3、2、1、10、9、8、7、6
4.互博式:此式最为关键,左右双掌交叉为十字执与胸前,向前推出。自己看看手指上的数字顺序有什么变化。
以下是delphi实现代码,本来想做一个可以用鼠标拖动的,鼓捣了半天还是不会,只能简单点了。