「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」
题目
给你一个 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 提示: -231 <= x <= 231 - 1
解题思路
我的第一想法就是把数字Number通过toString方法转化为字符串String,再通过split拆分字符串得到一个数组Array,再通过数组的reverse方法实现反转。再将Array数组通过join拼接回字符串,最后用parseInt变为Number类型。
因为分割成字符数组的原因,最后一步处理的String在x<0时会失去结尾的负号,所以x<0时结果加负号。
最后return时用三元表达式进行判断,以满足题目要求。
方法一:暴力拆分为字符串求解
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let result = parseInt(x.toString().split('').reverse().join(''));
if (x < 0) {
result = -result;
}
return result > 2147483647 || result < -2147483648 ? 0 : result;
};
除了自己想到的这种方法外,参考题解得到了一种更新奇的解决办法 —— 就是通过数学运算来反转整数。
通过对整数取余(%)可以得到最后一位数,/则可以得到除去最后一位数的10的倍数的一个新数。 例如:123%10 = 3;123/10 = 120。由此则可以有以下的解法。
方法二:数学法
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let result = 0;
while(x !== 0) {
result = result * 10 + x % 10;
x = x/10 | 0;
}
return (result | 0) === result ? result : 0;
};
注意:
要区分 | 和 || 的区别
-
定义不同:
||和|都是表示“或”,区别是||只要满足第一个条件,后面的条件就不再判断,而|要对所有的条件进行判断。
-
与操作和或操作的区别
(1)在程序中,使用与操作,要求所有表达式的判断结果都是TRUE,才为真,若有一个为FALSE,那么最终判断结果则为FALSE
(2)使用或操作,只要其中有一个表达式为TRUE,那么最终的结果就为TRUE,只有当所有的表达式为FALSE时最终结果才为FALSE
-
实际含义不同:
"||" : 如果左边计算后的操作数为true,右边则不再执行,返回true;
"|" : 前后两个操作数都会进行计算。也就是说:“|”不存在短路。
当使用
|时,若前面的表达式为真时,程序会继续执行后面的表达式,然后在得出TRUE的结果当使用
||(短路或)时,若前面的表达式结果为真,则程序不会再执行后面的表达式,直接得出TRUE的结果