探秘回文数:数学中的镜像艺术

184 阅读3分钟

前言

什么是回文数?

回文数是一种特殊的数字,无论你从左读还是从右读,其数值都保持不变。下面我将介绍三种方法来判断一个数是否为回文数,如果是则返回true;不是则返回false。

第一种(给定的数是Number类型)

我们可以想到数组有能够让自身翻转的方法

可以尝试将给定的数转为字符串再将字符串转为数组,再将数组进行翻转,数组再转为字符串进行比较。

  • 先给定一个数num,再使用toString()方法将num转为字符串,并将结果赋给str。
  • 再使用split()方法将字符串str转为数组,再使用reverse()方法将数组进行翻转,将结果赋给arr。
  • 再使用join()方法将数组转为字符串,结果赋给newStr。
  • 使用三元运算符str == newStr ? true : false判断这两个字符串是否相等,若相等则返回true,即这个数是回文数;否则返回false,即这个数不是回文数。
let num = 121

function isPalindrome(num) {
    let str = num.toString()
    let arr = str.split('').reverse()
    let newStr = arr.join('')
    return str == newStr ? true : false
}

console.log(isPalindrome(121));

打印结果

image.png

第二种(给定的数是String类型)

  • 我们先得到这个字符的长度赋给len。
  • 使用for循环,从字符串的开头开始,只遍历到字符串中间的位置len/2,因为对于回文数而言,前半部分和后半部分是完全镜像对称的,所以只需要比较前半部分和后半部分的相应字符即可。
  • if判断条件str[i] != str[len - i - 1]用于比较当前索引i处的字符和从末尾开始位置len - i - 1的字符,在比较的过程中如果有任何一个字符不匹配则返回false,即说明其不是回文数。
  • 若循环完成且没有发现任何不匹配的字符,则函数返回true,表示输入的字符串是一个回文数。
let str = 'ababa'
function isPalindrome(str) {
    const len = str.length
    for(i = 0; i < len / 2; i++) {
        if(str[i] != str[len - i - 1]) {
            return false
        }
    }
    return true
}
console.log(isPalindrome(str))

打印结果

image.png

第三种(给定的数是String类型)

使用指针的思想,定义两个指针i和j,分别从字符串的开头和结尾向中间移动,实现逐个比较字符。

  • 首先初始化两个指针,i设置为0,指向字符串的起始位置;j设置为str.length - 1,指向字符串的末位。
  • 将字符串str转为数组arr。(这一步其实可以省略,因为在javaScript中,字符串本身就支持通过索引访问字符。)
  • 使用一个while循环,if条件判断比较arr[i]arr[j]是否相等。如果相等,i增加1,j减少1,使得其向中间移动;若发现arr[i]arr[j]不相等,则返回false,表明不是一个回文字符串。
  • 循环正常结束返回true,表明是一个回文字符串。
let str = 'ababa'
function isPalindrome(str) {
    let i = 0
    let j = str.length - 1
    let arr = str.split('')
    while(i < j) {
        if(arr[i] == arr[j]) {
            i++
            j--
        }else {
            return false
        }
    }
    return true
}

console.log(isPalindrome(str))

打印结果

image.png

结论

三种方法判断回文字符串,你学会了吗?

Thanks1.png