今天遇到一个挺多场景都会用到的一个初级算法问题,也是在跟着这本《Android编程权威指南》顺带出来的一个小问题,经过我的抽象,问题可以总结为:
给你一个固定长度length的数组和一个数组下标index(初始指向数组头),要求实现两个函数pre和next,pre是让数组下标向前移动一步,指向上一个元素;可想而知,next是让数组下标向后移动一步,指向下一个元素。需要注意的是,当当前下标指向最后一个元素并且调用next时,下标会移动到第一个元素;而当当前下标指向第一个元素并且调用pre时,下标会移动到最后一个元素。
啊这。。这不是很简单么,next函数不就是index =(index+1)%len 么,so easy.是的,这确实非常简单,可是pre该怎么做呢?给你三分钟的思考时间
你的想法是不是这样呢,当index指向0时,index=len-1,否则index--。对是对的,可是,总感觉很low有木有,这根本体现不出代码(实际上是数学)之美,那么有没有更好的方法呢?有,如果pre与next是相反的话,大胆猜测一下,有可能是这样的:index=(index-1)%len,可是不对啊,当index为0时,index=-1对len求余,假设len是3,那么余数就是-1,但正确答案应该是2才对,那再做个怎样的修正才能得到正确答案呢,给你三分钟的思考时间
正确的修正方式是给index-1再加上一个len即可。可以验证一下,
当index为0时,index-1+3=2,2%3=2,正确
当index为2时,index-1+3=4,4%3=1,正确
当indwx=1时,index-1+3=3,3%3=0,正确
使用不同的len代入验证时,均正确。
仔细想想这个len的作用,当index=0时,因为len的存在,相当于在len的基础上-1;而当index=2时,相当于在len的基础上加2。在0到len的范围内的数对len求余必然是它本身,而在len到2*len范围内的数(len+index)对len求余,答案必然是index。仔细回味我说的这段话,你是不是感觉到了什么。
所以正确答案是index=(index-1+len)%len,与index=(index+1)%len形成了完美的统一。