7. 整数反转

leetCode数组

https://leetcode-cn.com/problems/reverse-integer/ (opens new window)

# 解法一:逆序输出

  1. 整数转换成字符串,字符串转换成数组
  2. 创建新数组,旧数组逆序遍历push进新数组
  3. 将新的数组转换成字符串,字符串转换成数组
  4. 空间复杂度O(n),时间复杂度O(n)

注意:

  • 数字如果超出范围,要返回0
  • 符号处理:正负数都当正数处理
/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    // 获取符号
    const sign = Math.sign(x);
    // 都用正数处理
    x = Math.abs(x);
    // 将整数转换字符串再转换成数组
    const arr = x.toString().split('');
    // 定义一个新数组
    const result = [];
    // 逆序遍历
    for(let i = arr.length - 1; i >= 0; i--) {
        result.push(arr[i])
    }
    // 将数组转换字符串再转换成整数
    x = result.join('') * sign;
    // 判断是否溢出,溢出返回0
    if (x >= Math.pow(2, 31) - 1 || x <= (-1) * Math.pow(2, 31)) return 0;
    // 将转换后的整数返回
    return x;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

反转数组可以用系统函数reverse,这样是对当前数组进行反转,不用创建新数组了








 
 
 
 




/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    const sign = Math.sign(x);
    x = Math.abs(x);
    // 将整数转换字符串再转换成数组并反转
    const arr = x.toString().split('').reverse();
    // 将数组转换字符串再转换成整数
    x = arr.join('') * sign;
    if (x >= Math.pow(2, 31) - 1 || x <= (-1) * Math.pow(2, 31)) return 0;
    return x;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14

涉及js知识点:

  1. 存储符号:Math.sign(x)
  2. 获取绝对值:Math.abs(x)
  3. 整数转换成字符串:x.toString()
  4. 字符串转换成数组:x.split('')
  5. 数组转换成字符串:arr.join('')
  6. 字符串转换成整数:隐式转换 乘、除即可
  7. 反向遍历:for循环反向遍历,reverse()返回原数组
  8. 整数范围:(-1) * Math.pow(2, 31) ---> Math.pow(2, 31) - 1

# 解法二:首尾交换

  1. 整数转换成字符串,字符串转换成数组
  2. 数组首(start)尾(end)索引在的元素交换,循环结束条件是start >= end
  3. 将换好的数组转换成字符串,字符串转换成数组
  4. 空间复杂度O(n),时间复杂度O(n)

注意:

  • 数字如果超出范围,要返回0
  • 符号处理:正负数都当正数处理
/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    // 获取符号
    const sign = Math.sign(x);
    // 都用正数处理
    x = Math.abs(x);
    // 整数转换成字符串转换成数组
    const arr = x.toString().split('');
    // 定义两个索引指向数组头部和尾部
    let start = 0;
    let end = arr.length - 1;
    // 循环中,如果start > end说明数组是偶数, start = end 说明数组是奇数
    while(start < end) {
        // 交换元素
        let temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
        // 两遍索引向中间靠拢
        start++;
        end--;
    }
    // 将数组转换成字符串转换成整数
    x = arr.join('') * sign;
    // 判断是否溢出,溢出返回0
    if (x >= Math.pow(2, 31) - 1 || x <= (-1) * Math.pow(2, 31)) return 0;
    // 将转换后的整数返回
    return x;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

交换数组两个元素的方式,在ES6中可以用[a,b] = [b,a]来做

















 
 












/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    // 获取符号
    const sign = Math.sign(x);
    // 都用正数处理
    x = Math.abs(x);
    // 整数转换成字符串转换成数组
    const arr = x.toString().split('');
    // 定义两个索引指向数组头部和尾部
    let start = 0;
    let end = arr.length - 1;
    // 循环中,如果start > end说明数组是偶数, start = end 说明数组是奇数
    while(start < end) {
        // 交换元素
        [arr[start], arr[end]] = [arr[end], arr[start]];
        // 两遍索引向中间靠拢
        start++;
        end--;
    }
    // 将数组转换成字符串转换成整数
    x = arr.join('') * sign;
    // 判断是否溢出,溢出返回0
    if (x >= Math.pow(2, 31) - 1 || x <= (-1) * Math.pow(2, 31)) return 0;
    // 将转换后的整数返回
    return x;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

涉及js知识点:

  1. 存储符号:Math.sign(x)
  2. 获取绝对值:Math.abs(x)
  3. 整数转换成字符串:x.toString()
  4. 字符串转换成数组:x.split('')
  5. 数组转换成字符串:arr.join('')
  6. 字符串转换成整数:隐式转换 乘、除即可
  7. 首尾指针循环结束的条件,start >= end, start > end是偶数数组,start = end是奇数数组
  8. 数组两个元素交换方法:[a,b] = [b,a] ; temp = a, a=b, b=temp;
  9. 整数范围:(-1) * Math.pow(2, 31) ---> Math.pow(2, 31) - 1

# 解法三:数学运算

  1. x % 10 ----> 个位数字
  2. 每一位数组变成个位数字
  3. 每一位数字计算累加
/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    // 获取符号
    const sign = Math.sign(x);
    // 都用正数处理
    x = Math.abs(x);
    let result = 0;
    // 循环到x为0结束
    while(x !== 0) {
        // 获取个位数字
        let num = x % 10;
        // 在原有基础上累加
        result = result * 10 + num;
        // x去掉个位数字
        x = Math.floor(x / 10);
    }
    // 获取符号
    result = result * sign;
    // 判断是否溢出,溢出返回0
    if (result >= Math.pow(2, 31) - 1 || result <= (-1) * Math.pow(2, 31)) return 0;
    // 将转换后的整数返回
    return result;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

ES6中,Math.pow可以写成 **

更新时间: 2022-03-25 17:04