トピック
1 ~ n のすべての対称数 (回文数) を取得します。次に例を示します。
1-9
11 22 33 ..
101 111 121 131 ...
....
アイデア 1
トラバースして、2 つの変数 n1、n2 を覚えてください。
- n1 は、文字列に変換された走査された数値です。
- n2 は、各数値を文字列に変換し、次に配列に変換し、次に逆変換してから文字列に変換します。
n1 と n2 が等しいかどうかを比較することは回文です。
/**
* 查询 1-max 的所有对称数(数组反转)
* @param max 最大值
*/
export 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
}
アイデア 2
アイデア 1 と同様に、アイデア 1 は配列比較に変換され、アイデア 2 は文字列を先頭から末尾まで比較します。
/**
* 查询 1-max 的所有对称数(字符串前后比较)
* @param max 最大值
*/
export 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
}
アイデア 3
ロールオーバーを生成する
/**
* 查询 1-max 的所有对称数(翻转数字)
* @param max 最大值
*/
export 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 // 存储翻转数
// 生成翻转数
while (n > 0) {
rev = rev * 10 + n % 10
n = 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') // 408ms
console.time('findPalindromeNumbers2')
findPalindromeNumbers2(100 * 10000)
console.timeEnd('findPalindromeNumbers2') // 53ms
console.time('findPalindromeNumbers3')
findPalindromeNumbers3(100 * 10000)
console.timeEnd('findPalindromeNumbers3') // 42ms
- 配列の変換に時間がかかる
- 数値の操作はより速く、コンピュータの原型は電卓です