文章目录
题目
标题和出处
标题:十-二进制数的最少数目
难度
4 级
题目描述
要求
如果一个十进制数字不含任何前导零,且每一位上的数字都是 0 \texttt{0} 0 或 1 \texttt{1} 1,那么该数字就是一个十-二进制数 。例如, 101 \texttt{101} 101 和 1100 \texttt{1100} 1100 都是十-二进制数 ,而 112 \texttt{112} 112 和 3001 \texttt{3001} 3001 不是。
给定一个表示十进制整数的字符串 n \texttt{n} n,返回和为 n \texttt{n} n 的十-二进制数 的最少数目。
示例
示例 1:
输入: n = "32" \texttt{n = "32"} n = "32"
输出: 3 \texttt{3} 3
解释: 10 + 11 + 11 = 32 \texttt{10} + \texttt{11} + \texttt{11} = \texttt{32} 10+11+11=32
示例 2:
输入: n = "82734" \texttt{n = "82734"} n = "82734"
输出: 8 \texttt{8} 8
示例 3:
输入: n = "27346209830709182346" \texttt{n = "27346209830709182346"} n = "27346209830709182346"
输出: 9 \texttt{9} 9
数据范围
- 1 ≤ n.length ≤ 10 5 \texttt{1} \le \texttt{n.length} \le \texttt{10}^\texttt{5} 1≤n.length≤105
- n \texttt{n} n 仅由数字组成
- n \texttt{n} n 不含任何前导零并总是表示正整数
解法
思路和算法
对于字符串 n n n 的每一位 digit \textit{digit} digit,当 digit > 0 \textit{digit} > 0 digit>0 时至少需要 digit \textit{digit} digit 个十-二进制数作为加数才能满足所有加数之和的当前位等于 digit \textit{digit} digit。理由如下。
-
如果不发生进位,则如果作为加数的十进制数个数小于 digit \textit{digit} digit,则一定存在加数的该位上的值大于 1 1 1,不符合十-二进制数的要求。
-
如果发生进位,则进位来源于更低位,此时至少需要 10 × digit 10 \times \textit{digit} 10×digit 个十-二进制数,否则一定存在加数的更低位上的值大于 1 1 1,不符合十-二进制数的要求。
将字符串 n n n 中的最大的一位数记为 maxDigit \textit{maxDigit} maxDigit,则和为 n n n 的十-二进制数的最少数目一定大于等于 maxDigit \textit{maxDigit} maxDigit。可以构造出和为 n n n 的 maxDigit \textit{maxDigit} maxDigit 个十-二进制数,做法如下。
-
创建 maxDigit \textit{maxDigit} maxDigit 个与 n n n 长度相同的十-二进制数,初始时每个十-二进制数的所有位都是 0 0 0。允许存在前导零。
-
对于 n n n 中等于 maxDigit \textit{maxDigit} maxDigit 的每一位,将全部 maxDigit \textit{maxDigit} maxDigit 个十-二进制数的对应位上的值设为 1 1 1。
-
对于 n n n 中大于 0 0 0 且小于 maxDigit \textit{maxDigit} maxDigit 的每一位,将该位的值记为 digit \textit{digit} digit,则 digit < maxDigit \textit{digit} < \textit{maxDigit} digit<maxDigit,从 maxDigit \textit{maxDigit} maxDigit 个十-二进制数中任选 digit \textit{digit} digit 个数将对应位上的值设为 1 1 1。
由于每次对 maxDigit \textit{maxDigit} maxDigit 个十-二进制数的赋值都只是对其中的一个数位操作,且每次操作的数位各不相同,因此构造出的和为 n n n 的 maxDigit \textit{maxDigit} maxDigit 个十进制数都符合十-二进制数的要求。
根据上述分析,可以使用贪心的思想计算和为 n n n 的十-二进制数的最少数目。
具体做法是,遍历字符串 n n n 并得到最大的一位数 maxDigit \textit{maxDigit} maxDigit,则 maxDigit \textit{maxDigit} maxDigit 即为最少数目。
代码
java
class Solution {
public int minPartitions(String n) {
int maxDigit = 0;
int length = n.length();
for (int i = 0; i < length; i++) {
int digit = n.charAt(i) - '0';
maxDigit = Math.max(maxDigit, digit);
}
return maxDigit;
}
}
复杂度分析
-
时间复杂度: O ( m ) O(m) O(m),其中 m m m 是字符串 n n n 的长度。需要遍历字符串 n n n 一次并计算最少数目。
-
空间复杂度: O ( 1 ) O(1) O(1)。