给定一个十进制数字,比如32、82734或者一个非常大的由数字组成的字符串,要求把它表示成若干个“0-1”字符串之和。这里的“0-1”字符串指的是每一位只能是0或者1的十进制数,例如0、1、10、101、1101等。目标是用最少的这种字符串,让它们的和恰好等于原来的数字。这个问题初看似乎需要一些搜索或者动态规划,但真正动手分析之后会发现,答案就藏在数字的每一位里。

问题理解:什么是0-1字符串之和
先明确一下定义。一个“0-1”字符串就是一个十进制整数,它的每一个十进制位只能是0或1。比如1、10、11、101、1001都是合法的,而2、12、203这类数就不是。要求把给定的数字n拆成若干这样的数相加,每个数可以重复使用,但总个数要最少。
例如n=32,如果只用1来拆,需要32个1,数量很多。但我们可以尝试用11、11、10三个数,它们的和正好是32,而且个数只有3。再比如n=82734,如果逐位去凑,会发现每一列加起来要正好等于对应位的数字,而每个加数在该列最多只能贡献1,因此每一列至少需要等于该列数字的加数个数。
这个观察直接指向一个关键结论:答案就是n中最大的数字字符。对于82734,最大数字是8,所以至少需要8个0-1字符串。构造方法也很直接:准备8个字符串,对于每一位(比如千位是2),就把前2个字符串的千位置为1,其余置为0;百位是7,就把前7个字符串的百位置为1,其余置为0。这样每一列的和恰好等于该位的数字,而且使用的字符串个数正好是8。
贪心证明:为什么最大值就是答案
下界非常容易证明。假设n的某一位数字是d,那么在所有参与求和的0-1字符串中,该位为1的字符串最多只能有d个,否则和就会超过d。反过来,要让这一位的总和达到d,至少需要d个字符串在该位提供1。因此,答案不可能小于n中最大的数字。
上界同样可以通过构造来证明。设m为n中最大的数字,那么我们可以构造m个0-1字符串。对于n从左到右的每一位数字d,我们让前d个字符串在该位置写1,后面的m-d个字符串该位置写0。这样每一列相加得到的数字正好是d,而且每个字符串的每一位都只会是0或1。因此存在一组m个0-1字符串的和等于n,说明答案不超过m。
综合上下界,答案恰好等于n中最大的数字。这个证明完全不需要任何复杂的数学工具,只用到每一位上数字的加法进位规则。理解了这一点,代码实现就变得非常直接。
代码实现与复杂度分析
按照上面的思路,只需要遍历一遍数字字符串,记录出现过的最大数字字符,然后返回它的整数值即可。输入可能非常大,甚至上千位,所以不能把它转换成整数类型处理,直接用字符串操作最安全。下面是Python版本的实现:
def min_partitions(n: str) -> int:
max_digit = 0
for ch in n:
digit = ord(ch) - ord('0')
if digit > max_digit:
max_digit = digit
return max_digit
Java版本的逻辑完全一致,只是语法略有不同。需要注意的是,输入字符串可能非常长,所以不要使用Integer.parseInt,直接遍历字符即可。
public int minPartitions(String n) {
int maxDigit = 0;
for (int i = 0; i < n.length(); i++) {
int digit = n.charAt(i) - '0';
if (digit > maxDigit) {
maxDigit = digit;
}
}
return maxDigit;
}
两个实现的时间复杂度都是O(n),其中n是字符串的长度,因为只需要一次线性扫描。空间复杂度是O(1),只使用了常数级的额外变量。这个效率对于任何规模的输入都能轻松应对。
常见误区与延伸思考
很多人看到“最少数量”会条件反射地想到动态规划或者贪心加回溯,但其实这类问题往往有更简单的结构。常见的错误做法是把n不断减去能减去的最大的0-1字符串,比如从32开始减11得到21,再减11得到10,再减10得到0,这样也得到3个,但这个方法在个别情况下可能不是最优,而且实现起来要维护大数减法。实际上用最大值法可以直接得出全局最优,不需要任何搜索。
另一个容易混淆的点是字符串的表示。如果题目把数字以二进制给出,或者允许0-1字符串中包含前导零,结论仍然不变。因为前导零不会影响每一位的数字之和,本质上每一位的贡献还是独立的。这个结论只依赖于十进制位上的数字,与数的进制表示无关。
如果要进一步扩展,比如允许负数或者允许每个0-1字符串带符号,问题的性质会发生变化,需要额外考虑抵消的情况。但就原始问题而言,答案就是最大数字这一条已经足够优雅且实用。在LeetCode等算法平台上,这个题目常作为简单题出现,理解它的证明过程有助于培养对位运算和贪心策略的直觉。