每日一练知识点:计算一个整数的所有数字和

LeetCode 1742 题“盒子中小球的最大数量”要求你找到一个盒子中能放入的小球的最大数量。

题目描述如下:

  • 给定两个整数 lowLimithighLimit,它们表示小球的编号范围(从 lowLimithighLimit)。
  • 每个小球都会放入一个盒子中,盒子根据小球编号的数字和来分配。
  • 你需要计算哪一个盒子包含的小球数量最多,并返回这个最大数量。

解体关键知识点:如何计算一个整数各位上的数字的和,如321 =>3+2+1

// 迭代方式计算数字和
func cal(num int) int {
    sum := 0
    for num > 0 {
        sum += num % 10
        num /= 10
    }
    return sum
}

//递归方式

func cal(num int) int {
	if num == 0 {
		return 0
	}
	return num%10 + cal(num/10)
}

解题:

func countBalls(lowLimit int, highLimit int) int {
    max := 0
    mp := make(map[int]int)
    for i := lowLimit; i <= highLimit; i++ {
        sum := cal(i)
        mp[sum]++
        if max < mp[sum] {
            max = mp[sum]
        }
    }
    return max
}

// 迭代方式计算数字和
func cal(num int) int {
    sum := 0
    for num > 0 {
        sum += num % 10
        num /= 10
    }
    return sum
}

解释:

  1. 数字和计算:我们使用 ballCopy 来取出每个数字,并将其累加,直到 ballCopy 变为 0。每次取出个位数使用 % 10,然后通过 ballCopy /= 10 去掉最后一位。
  2. 哈希表:我们使用 map[int]int 来记录每个数字和对应的出现次数。
  3. 查找最大值:遍历 boxCount 中的值,找到出现最多小球的盒子。

时间复杂度:

  • 对于每个小球,我们需要计算其数字和,时间复杂度是 O(d),其中 d 是小球的位数。因为每个编号最多有 6 位,时间复杂度是 O(n),其中 n 是小球的数量(highLimit - lowLimit + 1)。

示例:

对于 lowLimit = 1highLimit = 10,代码会输出 2,因为数字和为 110 的小球数量最多,都是 2。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值