leetcode 9:回文数(JS)

151 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

题目

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

例如,121 是回文,而 123 不是。  

示例 1:

输入:x = 121 输出:true 示例 2:

输入:x = -121 输出:false 解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。 示例 3:

输入:x = 10 输出:false 解释:从右向左读, 为 01 。因此它不是一个回文数。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/pa… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析

  1. 回文数即左右对称,左边第i个数等于右边第end-i个数

  2. 数字个数可能是奇数、也可能是偶数

  3. 正负号也计算在内,-121不为回文数

思路

既然正负号计算在内,就无需额外考虑去掉符号,只需要保证数字的左右对称即可

奇数偶数位的数字都是从左侧和右侧开始遍历都一直相等,直到两侧的遍历相遇,若有一位不相等,即为非回文数

左右两侧遍历即双指针解法,需要将数字先转换成字符串,用于遍历,两个指针分别从左侧和右侧开始对应着对称的两个数字,退出条件即为两个指针相遇;

代码实现

/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
  const str = x+''; // 将数字转换为字符串,字符串可以遍历
  head = 0; // 头指针指向左端
  tail = str.length-1; // 尾指针指向右端
  while(head<tail){ // 双指针相遇了,则为回文数
    if(str[head]!==str[tail]) // 不相等则不为回文数
      return false;
    head++;  // 左右各进一位
    tail--;
  }
  return true;
};

结果

image.png

解法二:reverse

reverse是数组方法,用于倒转数组,这里可以直接将数字转化为数组,倒转后再拼接成字符串然后再比对是否一致

代码:

/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
    return x+'' === (x.+'').split('').reverse().join('')
};

这样写简洁很多~

解法二结果

image.png

估计是因为中间要创建数组,所以空间复杂度略大了些