2020年4月26日

回文数字

问题描述

给定一个正整数n,找出所有小于等于n的回文数字。回文数字是指正读和反读都相同的数字。

示例

输入: 100
输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99]

解题思路

/**
 * 使用数组的方式翻转来判断, 虽然是O(n)的时间复杂度,但是reverse的操作会增加时间复杂度
 * @param num 
 * @returns 
 */
export function findSymmetricNumberByArray(num: number): number[] {
    const res: number[] = [];
    for (let i = 0; i < num; i++) {
       (i + "").split("").reverse().join("") === i + "" ? res.push(i) : null;
    }
    return res;
}

/**
 * 使用字符串的方式翻转来判断
 * @param num
 * @returns
 */
export function findSymmetricNumberByStrCompare(num: number): number[] {
    const res: number[] = [];
    for (let i = 0; i < num; i++) {
        const str = i + "";
        const len = str.length;
        let flag = true;
        let start = 0;
        let end = len - 1;
        while (start < end) {
            if (str[start] !== str[end]) {
                flag = false;
                break;
            }
            start++;
            end--;
        }
        if (flag) {
            res.push(i);
        }
    }
    return res;
}

/**
 * 使用数学的方式翻转来判断, 时间复杂度为O(n)。
 * @param num
 * @returns
 **/
export function findSymmetricNumberByMath(num: number): number[] {
    const res: number[] = [];
    for (let i = 0; i < num; i++) {
        let n = i;
        let rev = 0;
        while (n > 0) {
            rev = rev * 10 + n % 10;
            n = Math.floor(n / 10);
        }
        if (rev === i) {
            res.push(i);
        }
    }
    return res;
}
Share