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)次幂,即 baseexponent
  • Math.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(logx)。翻转的次数即 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 };

 

posted @ 2021-05-14 11:40  icyyyy  阅读(37)  评论(0)    收藏  举报