题目
获取1-n 之间所有的对称数(回文数),例如:
1-9
11 22 33 ..
101 111 121 131 ...
....
思路一
遍历,记两个变量 n1、n2。
- n1 是遍历的数字转为字符串
- n2 是把每个数字转换为字符串,再转换为数组,再进行反转,再转为字符串。
比较 n1 和 n2 相等的话则是回文。
/*** 查询 1-max 的所有对称数(数组反转)* @param max 最大值*/
export function findPalindromeNumbers1(max: number): number[] {const res: number[] = []if (max <= 0) return resfor (let i = 1; i <= max; i++) {// 转换为字符串,转换为数组,再反转,比较const s = i.toString()if (s === s.split('').reverse().join('')) {res.push(i)}}return res
}
思路二
和思路一差不多,思路一是转化为数组比较,思路二将字符串进行头尾比较
/*** 查询 1-max 的所有对称数(字符串前后比较)* @param max 最大值*/
export function findPalindromeNumbers2(max: number): number[] {const res: number[] = []if (max <= 0) return resfor (let i = 1; i <= max; i++) {const s = i.toString()const length = s.length// 字符串头尾比较let flag = truelet startIndex = 0 // 字符串开始let endIndex = length - 1 // 字符串结束while (startIndex < endIndex) {if (s[startIndex] !== s[endIndex]) {flag = falsebreak} else {// 继续比较startIndex++endIndex--}}if (flag) res.push(i)}return res
}
思路三
生成翻转数
/*** 查询 1-max 的所有对称数(翻转数字)* @param max 最大值*/
export function findPalindromeNumbers3(max: number): number[] {const res: number[] = []if (max <= 0) return resfor (let i = 1; i <= max; i++) {let n = ilet rev = 0 // 存储翻转数// 生成翻转数while (n > 0) {rev = rev * 10 + n % 10n = Math.floor(n / 10)}if (i === rev) res.push(i)}return res
}
测试
// 功能测试
console.info(findPalindromeNumbers3(200))// 性能测试
console.time('findPalindromeNumbers1')
findPalindromeNumbers1(100 * 10000)
console.timeEnd('findPalindromeNumbers1') // 408msconsole.time('findPalindromeNumbers2')
findPalindromeNumbers2(100 * 10000)
console.timeEnd('findPalindromeNumbers2') // 53msconsole.time('findPalindromeNumbers3')
findPalindromeNumbers3(100 * 10000)
console.timeEnd('findPalindromeNumbers3') // 42ms
- 数组的转换需要时间
- 操作数字更快,电脑原型就是计算器