[Leetcode] 660. Remove 9 解题报告

这篇博客介绍了LeetCode上的第660题,题目要求从1开始移除所有包含9的整数,然后找出序列中的第n个数。作者发现,移除9后的新序列与9进制数对应,因此通过将n转化为9进制再转换回十进制即可找到答案。文章分析了问题的思路,时间复杂度和空间复杂度,并给出了具体的解题代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

Start from integer 1, remove any integer that contains 9 such as 9, 19, 29...

So now, you will have a new integer sequence: 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, ...

Given a positive integer n, you need to return the n-th integer after removing. Note that 1 will be the first integer.

Example 1:

Input: 9
Output: 10

Hint: n will not exceed 9 x 10^8.

思路

我们首先找规律,移除含有9的数字之后:

8后面的数成了10,

18后面的数成了20,

……

88后面的数成了100.

而这刚好就是9进制数的特点:每次遇到9就进位。如果我们把n转换为就进制n’,然后把n'当做十进制输出出来,就是所求的结果。妙不妙?

注意这里仅仅局限于移除9的情况。如果需要移除8或者7就不能这样了。假如需要移除7,如果转换为7进制,则把含有8,9的数也会错误地移除掉。如果遇到其它数字,就需要设计更通用的方法了,好像挺复杂的。

这个算法的时间复杂度是O(logn),空间复杂度是O(1)。

代码

class Solution {
public:
    int newInteger(int n) {
        int ans = 0;
        int base = 1;
        while(n != 0) {
            ans = (n % 9) * base + ans;
            n /= 9;
            base *= 10;
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值