问题从谷歌的一道面试题开始:
给你一个英语的语句,比如"London bridge is falling down",把它完全倒装过来,"down falling is bridge London",如何不使用额外的存储空间完成这个倒装过程?
第一步,先将整个句子看成是一个完整的字符串,以字母为单位头尾对调,这样上面的句子就变成了下面这样一个乱七八糟的字符串:
“nwod gnillaf si egdirb nodnoL”
上面这一串字,你可能根本看不懂,但是没有关系。接下来我们再完成第二步,你就看清楚了。
第二步,把用空格分割的每一个字串以字母为单位,头尾对调。比如第一个字串是nwod,头尾对调后是down,也就是原来句子中的最后一个单词。第二个字串是gnillaf,字母头尾对调后是falling,原来句子中倒数第二个单词。这样一个个地做,直到最后一个字串里的字母对调完毕。这样就得到了下面的倒装句子:
“down falling is bridge London.”
这个问题有两个反思:
1. 递归可以简化问题;
2. 有时候要打破常规思维,为了达到目的,可能中间会有看似无意义的事情,但只要信息没有丢失,看似无意义的事情还可以还原回有意义的事情。