提一个需求:
在一个数组中,将指定索引的值取出,放到数组的最后,且除了此索引,其他索引值的左右相对位置不变。
这个问题非常简单,一看就出现思路了吧。
![](https://i-blog.csdnimg.cn/blog_migrate/2a5c9091ff5afc4e77b69224403423db.png)
方法一:将指定的值存起来,然后后面依次覆盖前面,最后把temp赋给最后的位置。
方法二:从左到右一对对交换到最后。
显然方法一效率更高。
像这种知识点太简单了,简单到潜意识直接处理了,连自己都没意识到。
但是如此简单的技巧,放入一个更加繁杂的环境中,还能意识到吗?
我学习韩顺平老师的教学视频时,写的是堆排序的一个方法,当他的代码写到以下位置时,我一度以为他写错了,只是把子节点的值赋给了父节点,却忘了把父节点的值换到子节点的位置:
![](https://i-blog.csdnimg.cn/blog_migrate/d2f07e5ecf52a8d627be7fd1e0d3ca18.png)
直到他写到最后,我按他的代码认真推了一遍。发现他的做法不仅是正确的,而且还是更高效的,就相当于我刚才做那道数组题时用的方法一。而如下我自己写的代码,却相当于明显效率更低的方法二:
![](https://i-blog.csdnimg.cn/blog_migrate/017a28216265959607ad5b4b14eb365b.png)
无论是数组那道简单题,还是这种有点复杂的场景,在这一点上,本质上完全是同一个问题,为什么前者我就能够自然而然地想到,而后者只是换了个形式就不行了?
或许一方面是因为我对于堆排序过程的理解不够熟练,不够深。但另一方面,是因为我并没有将方法一的知识抽象地认识,彻底地明白,只是浮于表面,受限于特定的载体。
这件事给我的提醒是:当我们学习一个技巧或方法时,要将它的原理抽象地理解,深入地理解,这样才能轻易将它匹配在各种不同的形式上,而不受限于特定的某个形式,这样才能够举一反三,如果像我那样同一个东西换个地方就想不出来了,那就事倍功半了。