/** * @param {number} x * @return {number} */ const reverse = function(x) { const arr = [] const xAbs = Math.abs(x) for (let number of xAbs.toString()) { arr.push(number) } arr.reverse() let result = 0 for (i = arr.length, j = 0; i > 0; i--, j++) { result += arr[j] * Math.pow(10, i - 1) } if (result >= Math.pow(2, 31)) { return0 } return x < 0 ? 0 - result : result };
整个过程做了2次循环,还做了很多次的指数运算,虽然还是O(lg(n)),但效率相对较低
使用取模的办法来获取每一位数,这样就减少了10的指数运算,并且只做了一次循环
1 2 3 4 5 6 7 8 9 10 11 12 13
const reverse2 = function(x) { let result = 0 let xAbs = x < 0 ? x * -1 : x while (xAbs !== 0) { let pop = xAbs % 10; xAbs = Math.floor(xAbs / 10); result = result * 10 + pop } if (result >= 2**31 - 1) { return0 } return x < 0 ? 0 - result : result }
但这种方法依然是做了算计计算,取模,乘除
用字符串拼接的方法
1 2 3 4 5 6 7 8 9 10
const xAbs = Math.abs(x).toString() let result = '' for (let i = 0; i < xAbs.length; i++) { result += xAbs[xAbs.length - i - 1] } result = parseInt(result) if (result > 2**31 - 1) { return0 } return x < 0 ? 0 - result :