计算不同的数字

时间:2019-06-12 10:39:33

标签: algorithm math number-theory

是否有任何有效的方法可以在固定时间内或O(Logn)中从给定数字中找出不同数字的计数?

假设n = 1234的计数应为4(因为有4个不同的数字)

如果n = 1121的计数应为2(因为2的数字不同,即1, 2

约束:0 <= n <= 1000000007

3 个答案:

答案 0 :(得分:2)

使用键为数字,值为计数的地图。现在,地图的大小将成为您的答案。 要么 使用集合,因为集合不包含重复的元素大小,这将是您的答案

答案 1 :(得分:2)

伪代码:

int DistinctDigits(int n)
{
    int result = 0;
    bool[10] digitFound = {false};

    while (n > 0)
    {
      d = n % 10;
      n = n / 10;

      if (!digitFound[d])
      {
        result++;
        digitFound[d] = true;
      }
    }
    return result;
}

请注意,您必须考虑如何处理前导零(包括当n == 0时)。

答案 2 :(得分:0)

由于数字(相对)小,我们可以将它们转换为字符串,将它们通过uniqness过滤器,然后计算元素的数量。例如在Python中:

def nuniqdigits(n):
    return len(set(str(n)))

转换为字符串相对昂贵,我们可以迭代地枚举数字,如下所示:

def digits(n):
    if n:
        while n:
            yield n % 10
            n //= 10
    else:
        yield 0

因此我们可以计算出不同数字的位数:

def nuniqdigits(n):
    return len(set(digits(n)))

由于数字的可能值受到限制,因此我们可以在此处使用位掩码。例如在Haskell中:

import Data.Bits((.|.), popCount, shiftL)
import Data.Word(Word16)

nuniqdigits :: Int -> Int
nuniqdigits n = popCount (foldr (.|.) (0 :: Word16) (map (shiftL 1) (digits n)))
    where digits n | n <= 9 = [n]
                   | otherwise = uncurry (flip (:) . digits) (divMod n 10)

一个数字 n 具有 O(log n)个数字,由于我们进行了数字位数的迭代,并且每次迭代中的所有运算都是恒定的,因此运行在 O(log n)中。