是否有任何有效的方法可以在固定时间内或O(Logn)中从给定数字中找出不同数字的计数?
假设n = 1234
的计数应为4
(因为有4
个不同的数字)
如果n = 1121
的计数应为2
(因为2
的数字不同,即1, 2
)
约束:0 <= n <= 1000000007
答案 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)中。