求1-10000之间所有的对称数(回文)
思路一:
/** 思路一:使用数组反转、比较
* 数字转换为字符串,再转换为数组
* 数组reverse,再join为字符串
* 两个字符串比较
*/
function findPalindromeNumbers1(max:number):number[]{
const res:number[]=[]
if(max<=0) return res
for (let i = 1; i <= max; i++) {
const s=i.toString()
if(s===s.split('').reverse().join('')){
res.push(i)
}
return res
}
思路二:
/**
* 思路二:字符串头尾比较
* 数字转换为字符串
* 字符串头尾比较
* 也可以用栈,像括号匹配,但要注意奇偶数
*/
function findPalindromeNumbers2(max:number):number[]{
const res:number[]=[]
if(max<=0) return res
for (let i = 1; i <= max; i++) {
const s=i.toString()
const length=s.length
let flag=true
let startIndex=0
let endIndex=length-1
while(startIndex<endIndex){
if(s[startIndex]!==s[endIndex]){
flag=false
break
}else{
startIndex++
endIndex--
}
}
if(flag) res.push(i)
}
return res
}
思路三:
/**
* 思路三:生成翻转数
* 使用%和Math.floor生成翻转数
* 前后数字进行对比
*/
function findPalindromeNumbers3(max:number):number[]{
const res:number[]=[]
if(max<=0) return res
for (let i = 1; i <= max; i++) {
let n=i
let rev =0
//i 123
//n 123
//rev 3
//n 12
//rev 30+2
//n 1
//rev 320+1
//n 0
while(n>0){
rev=rev*10+n%10
n=Math.floor(n/10)
}
if(i===rev) res.push(i)
}
return res
}
思路一: 看似是O(n) 但数组转换、操作都需要时间,所以慢
思路二vs思路三:操作数字更快(电脑原型就是计算器)
思路二要用栈,不合适,因为栈也一般用数组实现会慢