6-回文数
题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121 输出: true
示例 2:
输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10 输出: false 解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶: 你能不将整数转为字符串来解决这个问题吗?
解答
转成str
思路是这样的,先排负数的情况,然后开始验证是否回文 具体做法,是再造一个反转的str,然后i从0到str长度的中间,一头一尾地比对。有错就return,循环完了就true
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if (x < 0) {
// 负数不会是回文
return false;
}
const str = x.toString();
const reverseStr = str
.split("")
.reverse()
.join("");
for (let i = 0; i < Math.round(str.length / 2); i++) {
if (str[i] !== reverseStr[i]) {
return false;
}
}
return true
};执行用时 :404 ms, 在所有 JavaScript 提交中击败了58.78%的用户
内存消耗 :46.3 MB, 在所有 JavaScript 提交中击败了13.56%的用户
似乎一般般,占用的空间太大了。
优化
1. 最后一位不能是0,除非只有一位,即0
增加一个一开始判断的边界条件
2. 无需反转全部的str,只需反转后半部分
优化后的代码:
执行用时 :508 ms, 在所有 JavaScript 提交中击败了18.74%的用户
内存消耗 :47.8 MB, 在所有 JavaScript 提交中击败了5.01%的用户
反而好像更加不划算了。。 可能因为切字符串需要更多的时间和空间吧
进阶:纯粹用数字做
那么数字怎么切出最后一位?
那么数字怎么push一位?
那么怎么知道有没有切剩下一半? 只要比对一下切下来的长度,和原来x的长度。如果比x要长了,那么自然就超过一半了
执行用时 :244 ms, 在所有 JavaScript 提交中击败了99.93%的用户
内存消耗 :44.7 MB, 在所有 JavaScript 提交中击败了95.92%的用户
惊呆了,快得一批
测试代码
Last updated
Was this helpful?