此题解通过计算1到n每个数字的数位和,并将计算结果用作字典的键,将相同数位和的数字数量累加存储在字典中。计算数位和时,利用了数位变化的规律,特别是在数字每过10、100、1000的边界时进行调整。最后,将字典中的值(即每个组的大小)进行排序,通过比较找出并列最多的组数。
时间复杂度: O(n)
空间复杂度: O(k),其中k为不同数位和的数量,远小于n
class Solution:
def countLargestGroup(self, n: int) -> int:
my_dict = {}
i = 1
ss = 0
while i <= n:
if i % 10 == 0:
if i % 1000 == 0:
ss = 0
temp = i
while temp != 0:
ss += temp % 10
temp = temp // 10
elif i % 100 == 0:
ss -= 17
else:
ss -= 8
else:
ss += 1
my_dict[ss] = my_dict.setdefault(ss, 0) + 1
i += 1
arr = sorted(my_dict.values())
n = len(arr)
if arr[0] == arr[-1]:
return n
for j in range(n-2, -1, -1):
if arr[j] != arr[-1]:
return n - j - 1
# Comments added to the code:
# my_dict: Dictionary to hold sum of digits (key) and count of numbers with that sum (value)
# ss: Current sum of digits
# i: Current number being processed
# Adjustments for ss when i is a multiple of 10, 100, or 1000
# After processing, sort the counts and determine the number of groups with the maximum size