题目
思路一 数学
不断的除10,取余数添加到一个新的数的个位上,比如123,第一次123/10=12...3,第二次12/10=1...2,第三次1/10=0...1,余数分别为3/2/1,第一次为010+3=3,第二次为310+2=32,第三次为32*10+1=321,从而得出结果。
在JavaScript中除法运算是可能得出小数的,并且有可能存在负数,所以当是负数是需要向上取整,当是正数时需要向下取整。
编码
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let rev = 0;
while (x !== 0) {
const digit = x % 10;
// x = x < 0 ? Math.ceil(x / 10) : Math.floor(x / 10);
x = ~~(x / 10);
rev = rev * 10 + digit;
// 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
if (rev < Math.pow(-2, 31) || rev > Math.pow(2, 31) - 1) {
return 0;
}
}
return rev;
};
连续两次的按位取反做到负数向上取整,正数向下取整。
复杂度
时间复杂度:时间复杂度:大概就是数字的位数,比如x=1000,则需要4次,1000也是10的三次方,所以时间复杂度大概可以列为log10(x)+ 1,但x有可能为负数,随后进行去除常数、系数、低阶,得出最终时间复杂度为O(log10(|x|))。
空间复杂度:O(1)。