[LeetCode] 每日一题 3270. 求出数字答案
题目链接
题目描述
给你三个 正 整数 num1
,num2
和 num3
。
数字 num1
,num2
和 num3
的数字答案 key
是一个四位数,定义如下:
一开始,如果有数字 少于 四位数,给它补 前导 0 。
答案
key
的第i
个数位(1 <= i <= 4
)为num1
,num2
和num3
第i
个数位中的 最小 值。
请你返回三个数字 没有 前导 0 的数字答案。
示例输入
示例 1
输入:num1 = 1, num2 = 10, num3 = 1000
输出:0
解释:
补前导 0 后,num1 变为 "0001" ,num2 变为 "0010" ,num3 保持不变,为 "1000" 。
数字答案 key 的第 1 个数位为 min(0, 0, 1) 。
数字答案 key 的第 2 个数位为 min(0, 0, 0) 。
数字答案 key 的第 3 个数位为 min(0, 1, 0) 。
数字答案 key 的第 4 个数位为 min(1, 0, 0) 。
所以数字答案为 "0000" ,也就是 0 。
示例 2
输入: num1 = 987, num2 = 879, num3 = 798
输出:777
示例 3
输入:num1 = 1, num2 = 2, num3 = 3
输出:1
提示
1 <= num1, num2, num3 <= 9999
题解
解题思路
补齐四位数:为了处理数字可能少于四位的问题,可以在逻辑上将其视为补齐前导 0
逐位处理:从高位到低位逐位比较三个数字当前位的值,取其中的最小值
合成答案:用一个变量
ans
存储结果,按照十进制规则将最小值逐位累加到结果中更新剩余部分:每次计算完当前位后,使用取余操作更新三个数字,去掉当前最高位
返回结果:最终返回合成的数字
该方法的核心是利用除法和取余操作逐位截取数字,这种方法简洁高效,无需额外空间存储各位数
代码实现
class Solution {
public int generateKey(int num1, int num2, int num3) {
// 从最高位开始处理
int mul = 1000;
int ans = 0;
while (mul > 0) {
// 获取当前位的最小值
ans += Math.min(num1 / mul, Math.min(num2 / mul, num3 / mul)) * mul;
// 更新剩余部分
num1 %= mul;
num2 %= mul;
num3 %= mul;
// 移动到下一位
mul /= 10;
}
return ans;
}
}
复杂度分析
时间复杂度:
每次循环都处理一位数字,总共有 4 位,因此循环执行 4 次,时间复杂度为 O(1)
每次循环内进行除法、取余和最小值比较,这些操作的时间复杂度均为 O(1)
整体时间复杂度为 O(1)
空间复杂度:
除了
mul
和ans
两个额外的变量,没有使用其他存储空间,因此空间复杂度为 O(1)
总结
该方法通过逐位处理和简单的数学运算实现了问题的高效解决
优点是逻辑清晰,代码简洁,且具有常数时间和空间复杂度,非常适合用于处理这种简单的位数比较问题
希望这篇分享能为你带来启发!如果你有任何问题或建议,欢迎在评论区留言,与我共同交流探讨。
License:
CC BY 4.0