Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2021/04/20 - 回文数 #76

Open
lxinr opened this issue Apr 20, 2021 · 0 comments
Open

2021/04/20 - 回文数 #76

lxinr opened this issue Apr 20, 2021 · 0 comments

Comments

@lxinr
Copy link
Owner

lxinr commented Apr 20, 2021

题目

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是

思路一(字符串匹配)

将数字转成字符串str,定义两个指针一头一尾ij,两个指针分别移动,假如str[i]等于str[j]相等,则说明这一对字符是匹配的,则i1j1,继续循环,直到i大于j;如果不相等,说明不匹配,则跳出循环,返回false;循环匹配完成没有不等则返回true

临界情况处理

  • 针对小于0的数,它必然不是回文数,则直接返回false
  • 针对最后一位是0的数,它必然不是回文数,则直接返回false
  • 针对大于等于0且小于10的数,它必然是回文数,则直接返回true
代码实现
/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
  if (x < 0 || Math.floor(x % 10) === 0) return false
  if (x < 10) return true
  var s = '' + x
  var i = 0
  var j = s.length - 1
  while (i <= j) {
    if (s[i] !== s[j]) return false
    i++
    j--
  }
  return true
};

思路二(数字翻转)

通过获取a翻转过来的数字b,来判断两者是否相等

判断思路

  1. 如果完全翻转过来,可能会出现溢出的情况
  2. 且没有必要完全翻转来判断,仅需要翻转一半即可
  3. 如果x是偶数,则根据翻转后的数字rnx的前一半比较,如果相等,则说明是回文数
  4. 如果x是奇数,则根据翻转后的数字rn退一位的值与x的前一半比较,如果相等,则说明是回文数。即如12521,此时x12rn125,只需判断x === Math.floor(rn / 10)即可
代码实现
var isPalindrome = function(x) {
  // x小于0或x的最后一位是0则必然不是回文数
  if (x < 0 || Math.floor(x % 10) === 0) return false
  if (x < 10) return true
  var rn = 0
  // 只需要转一半即可进行判断
  // 如果x是偶数,则只需确认x === rn
  // 如果x是奇数,则中间那一位不需要判断,只需判断x === Math.floor(rn / 10),即退一位的数据
  while(x > rn) {
    // rn * 10 -> 进一位,如1234,第一次得到 0 * 10 + 4 = 4,第二次得到 4 * 10 + 3 = 43 ... 最终得到4321
    rn = Math.floor(rn * 10 + x % 10)
    // 退一位 如1234,第一次得到123,第二次得到12,最终到0
    x = Math.floor(x / 10)
  }
  return x === rn || x === Math.floor(rn / 10)
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant