问题
分析
这个问题很简单,一直取模求余、整除、乘以10累加就可以了。时间复杂度是\(O(n)\),空间复杂度为\(O(1)\)。
当然,也可以使用整数转换为字符串再构造反向字符串再转换为整数的方法,这种方法的时间复杂度依然是\(O(n)\),但是空间复杂度由于需要字符串辅助、则恶化为\(O(n)\)。
但是在实现整除法时发现,多数的编程语言(基本都是C语言及其子嗣)的整数取模运算是可以不处理输入数字的负号的,这涉及到不同编程语言的整数除法的定义。
多数编程语言的整数除法都使用截断(Truncate)小数的方法取整,在数学上就是向 0 取整,实际上很多硬件芯片最早支持的都是这种整数除法:
13 / 10 → 10 / 10 = 1 → 13 % 10 = 13 - 10 = 3 -13 / 10 → -10 / 10 = -1 → -13 % 10 = (-13) - (-10) = -3 result = 0 result = 0 * 10 + (-13 % 10) = -3 result = -3 * 10 + (-1 % 10) = -31
但偏偏 Python 与 Ruby 内置的整数除法使用的是向负无穷(-∞)取整的,所以这两个语言的算法的实现便需要先将负号提取出来:
13 / 10 → 10 / 10 = 1 → 13 % 10 = 13 - 10 = 3 -13 / 10 → -20 / 10 = -2 → -13 % 10 = (-13) - (-20) = 7 result = 0 result = 0 * 10 + (-13 % 10) = 7 result = 7 * 10 + (-2 % 10) = 78 result = 78 * 10 + (-1 % 10) = 789 result = 789 * 10 + (-1 % 10) = 7899 result = 7899 * 10 + (-1 % 10) = 78999 ...
在数学上,向负无穷(-∞)取整其实是更一致的,因为不论一个数在数轴的哪个位置、行为都是一样的;但是在编程的角度看,向 0 取整才是一个更合理方案。
既然有向负无穷取整,当然也有向正无穷(+∞)取整的整数除法,但是目前都没遇到任何编程语言使用这种整数除法(最好不要遇到)。
答案
打赏作者