Q:
题目链接:Reverse Integer和Palindrome Number
先看题目要求:
Reverse Integer:
Palindrome Number:
分析
看完题目要求,大家估计就知道为什么把这两个题目放到一起了,都是有关回文数字的题目。题目都不难,主要注意下题目要求,第七题要求出参是32位整型,如果不是,返回0(这个在javascript中貌似没有多大意义…)。第九题要求负数不能是回文数。先来看第七题的代码:
A:
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
x.toString().match(/([^\d]?)(\d+)/);
var sign = RegExp.$1;
var result = Number(sign+RegExp.$2.split('').reverse().join(''));
//注意处理32位有符号整型的要求
return (result>2147483648 || result<-2147483649)?0:result
};
利用了数组的reverse方法,再来看个不用reverse的方法:
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let result = 0
while(x) {
result = result * 10 + x % 10
x = ~~(x / 10)
}
if (result > 2147483648 || result < -2147483649) result = 0
return result
};
根据leetcode的执行结果可以看到两种方法的执行效率是基本一样的,时间复杂度为O(lgn)。
再来看第九题:
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
//不考虑负数
if(x < 0){
return false;
}
var s = x.toString()
if(s.split('').reverse().join('') === s){
return true;
}else{
return false;
}
};
我发现如果把返回语句写成这样:
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
//不考虑负数
//x.toString().match(/([^\d]?)(\d+)/)
if(x < 0)
return false;
var s = x.toString();
return s.split('').reverse().join('') === s
};
效率会有所下降,这里不知道是不是涉及一些隐式的运算和转换,请大神解答下!