算法思路

题目要求提取一个整数,从右到左读取,并去除重复的数字。为了实现这个功能,可以使用哈希表(Set)来记录已出现过的数字,从而避免重复。我们可以从右到左遍历整数的每一位数字,将遇到的未出现过的数字添加到结果中,最后将结果合成新的整数输出。

Code

const rl = require("readline").createInterface({ input: process.stdin });  // 输入接口
var iter = rl[Symbol.asyncIterator]();  // 异步迭代器
const readline = async () => (await iter.next()).value;  // 读取输入

void async function () {
    const num = await readline();  // 获取输入的整数
    let str = num.toString();  // 将整数转为字符串,便于逐位操作
    let result = [];  // 用于存放结果的数组
    let seen = new Set();  // 哈希表,记录已出现的数字
    
    // 从右向左遍历字符串中的每一位数字
    for (let i = str.length - 1; i >= 0; i--) {
        let digit = str[i];  // 获取当前位的数字
        if (!seen.has(digit)) {  // 如果该数字未出现过
            seen.add(digit);  // 将数字加入哈希表
            result.push(digit);  // 将数字加入结果数组
        }
    }
    
    // 结果数组
    console.log(result.join(''));
}()

复杂度分析

  • 时间复杂度:O(n),其中n是输入整数的位数。我们遍历了整数的每一位,因此时间复杂度为O(n)。
  • 空间复杂度:O(n),用于存储哈希表和结果数组。最坏情况下,输入的每一位数字都不同,需要O(n)的空间。