LeetCode1012.Numbers With 1 Repeated Digit(至少有 1 位重复的数字)

1012.Numbers With 1 Repeated Digit(至少有 1 位重复的数字)

Description

Given a positive integer N, return the number of positive integers less than or equal to N that have at least 1 repeated digit.


给定正整数 N,返回小于等于 N 且具有至少 1 位重复数字的正整数。

题目链接:https://leetcode.com/problems/numbers-with-1-repeated-digit/

个人主页:http://redtongue.cn or https://redtongue.github.io/

Difficulty: hard

Example 1:

Input: 20
Output: 1
Explanation: The only positive number (<= 20) with at least 1 repeated digit is 11.

Example 2:

Input: 100
Output: 10
Explanation: The positive numbers (<= 100) with atleast 1 repeated digit are 11, 22, 33, 44, 55, 66, 77, 88, 99, and 100.

Example 3:

Input: 1000
Output: 262

Note:

  • 0 <= N < 10^9

分析

  • updating

参考代码

def numDupDigitsAtMostN(self, N):
    L, res, n = map(int, str(N + 1))
    res, n = 0, len(L)
    def A(m, n):
        return 1 if n == 0 else A(m, n - 1) * (m - n + 1)

    for i in range(1, n): res += 9 * A(9, i - 1)
    s = set()
    for i, x in enumerate(L):
        for y in range(0 if i else 1, x):
            if y not in s:
                res += A(9 - i, n - i - 1)
        if x in s: break
        s.add(x)
    return N - res

猜你喜欢

转载自blog.csdn.net/redtongue/article/details/88617367