算法:获取1-10000之间所有的对称数(回文数)

题目

获取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 res

    for (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 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
}

思路三

生成翻转数

/**
 * 查询 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

  • 数组的转换需要时间
  • 操作数字更快,电脑原型就是计算器

猜你喜欢

转载自blog.csdn.net/weixin_43972437/article/details/130375934