如何不使用数学方法判断回文数?求字符串/数组实现方案
嘿,很高兴看到你已经用数学方法搞定了回文数判断!接下来咱们聊聊用字符串和数组怎么实现,其实思路超直观的,我一步步给你讲~
用字符串实现回文数判断
字符串方法的核心思路就是对比原字符串和反转后的字符串是否一致,或者用双指针从两端往中间校验,两种方式都很简单:
方法1:直接反转字符串对比
把数字转成字符串后,通过拆分、反转、拼接得到反转字符串,再和原字符串对比:
function isPalindrome(num) { // 先处理负数,负数带负号肯定不是回文数 if (num < 0) return false; const str = num.toString(); // 拆分字符数组 -> 反转数组 -> 转回字符串 const reversedStr = str.split('').reverse().join(''); return str === reversedStr; }
这里的split('')会把字符串拆成单个字符组成的数组,比如"121"变成["1","2","1"];reverse()反转数组顺序;join('')再把数组拼接回字符串,最后对比原字符串和反转后的字符串就行。
方法2:双指针逐位校验
如果不想生成新的反转字符串,可以用双指针从字符串两端往中间走,逐位对比字符:
function isPalindrome(num) { if (num < 0) return false; const str = num.toString(); let left = 0; let right = str.length - 1; while (left < right) { // 只要有一对字符不一样,直接返回false if (str[left] !== str[right]) { return false; } left++; right--; } // 所有对应位都一样,是回文数 return true; }
这种方法更节省内存,因为不需要额外存储反转后的字符串,对比到不一样的字符就能提前终止。
用数组实现回文数判断
数组方法的思路和你之前的数学方法有点像:先把数字的每一位提取出来存到数组里,再用双指针对比数组两端的元素:
function isPalindrome(num) { if (num < 0) return false; const digits = []; let n = num; // 把数字的每一位存入数组 while (n > 0) { // 取最后一位数字 digits.push(n % 10); // 去掉最后一位数字(注意用Math.floor取整) n = Math.floor(n / 10); } // 双指针对比数组两端 let left = 0; let right = digits.length - 1; while (left < right) { if (digits[left] !== digits[right]) { return false; } left++; right--; } return true; }
这里先通过循环把数字的每一位拆出来放进数组,比如121会变成[1,2,1],然后和字符串双指针的逻辑一样,从两端往中间对比,只要有一对元素不同就不是回文数。
其实不管用字符串还是数组,核心都是对称位置的元素/字符是否一致,理解了这个思路就很容易上手啦~
内容的提问来源于stack exchange,提问作者iggykimi
相关产品推荐
相关产品推荐

