7.整数反转/反转数字
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1: 输入:x = 123 输出:321 示例 2: 输入:x = -123 输出:-321 示例 3: 输入:x = 120 输出:21 示例 4: 输入:x = 0 输出:0
1 /** 2 * 3 * @param x int整型 4 * @return int整型 5 */ 6 function reverse( x ) { 7 // write code here 8 return x >= 0 9 ? parseInt(x.toString().split('').reverse().join('')) 10 : -parseInt(x.toString().split('').reverse().join('')); 11 } 12 module.exports = { 13 reverse : reverse 14 };
知识点:
(1)parseInt: 解析一个字符串并返回指定基数的十进制整数
(2)toString:把一个 Number 对象转换为一个字符串,并返回结果
(3)split:把一个字符串分割成字符串数组
(4)reverse:用于颠倒数组中元素的顺序
(5)join:将数组的所有元素连接成一个字符串
1 ['a','b','c'].join("+"); //"a+b+c"
2 'a+b+c'.split("+"); //["a", "b", "c"]
解题思路:
(1)数据类型转换
Math.pow()函数返回基数(base)的指数(exponent)次幂,即baseexponentMath.sign()函数返回一个数字的符号, 指示数字是正数,负数还是零Math.abs(x)函数返回指定数字 “x“ 的绝对值
1 /** 2 * @param {number} x 3 * @return {number} 4 */ 5 var reverse = function(x) { 6 var min = Math.pow(-2,31); 7 var max = Math.pow(2,31) - 1; 8 var sign = Math.sign(x); 9 x = Math.abs(x); 10 11 var result = x.toString().split('').reverse().join(''); 12 result = sign * parseInt(result); 13 if(result > max) return 0; 14 if(result < min) return 0; 15 return result; 16 };
(2)求余法
1 /** 2 * @param {number} x 3 * @return {number} 4 */ 5 var reverse = function(x) { 6 var min = Math.pow(-2,31); 7 var max = Math.pow(2,31) - 1; 8 var sign = Math.sign(x); 9 x = Math.abs(x); 10 var result = 0; 11 var remainder; 12 13 while(x>0){ 14 remainder = x % 10; 15 x = (x - remainder)/10; 16 result = result * 10 + remainder; 17 } 18 result *= sign; 19 20 if(result > max) return 0; 21 if(result < min) return 0; 22 return result; 23 };
(3)数学:一边取反,一边检测
-
时间复杂度:O(log∣x∣)。翻转的次数即 xx 十进制的位数
-
空间复杂度:O(1)
1 /** 2 * @param {number} x 3 * @return {number} 4 */ 5 var reverse = function(x) { 6 let rev =0; 7 while(x!==0){ 8 const digit = x%10; 9 x=~~(x/10); 10 rev=rev*10+digit; 11 if(rev<Math.pow(-2,31)||rev>Math.pow(2,31)-1){ 12 return 0; 13 } 14 } 15 return rev; 16 };

浙公网安备 33010602011771号