🍢 初学者友好指南 “Partitioning Into Minimum Number Of Deci-Binary Numbers” - 第1689题 (C++, Python, JavaScript)

发布: (2026年3月1日 GMT+8 10:52)
4 分钟阅读
原文: Dev.to

Source: Dev.to

Cover image for 🍢 初学者友好指南 “将数字拆分为最少数量的十进制二进制数” - 题目 1689

问题概述

给定:
一个表示非常大的正整数的字符串 n

目标:
找出能够相加得到 n十进制二进制 数(仅由数字 0 和 1 组成)的最少数量。

直觉

加法是逐位进行的。十进制二进制数在任意十进制位上只能贡献 01

  • 如果个位出现数字 7,则至少需要 7 个十进制二进制数来提供足够的 1 以凑成 7
  • 其他数字(例如 23)可以通过在这些位置上使用 0 来满足。

因此,限制因素 就是字符串中 最大数字
如果字符串中出现 9,就需要 9 个十进制二进制数;如果最大数字是 3,则需要 3 个。

示例讲解

示例 1:n = 32

  • 数字:3(十位)和 2(个位)。
  • 十位需要至少三个 110 + 10 + 10
  • 个位需要两个 111 + 11 + 10 = 32
  • 使用的总数:3(即最大数字)。

示例 2:n = 82734

  • 数字:8, 2, 7, 3, 4
  • 最大数字是 8
  • 必须有 8 个独立的数;其他位置可以用不超过 8 个 1 来构造。
  • 结果:8

代码块

C++

class Solution {
public:
    int minPartitions(string n) {
        int maxi = 0;
        for (char c : n) {
            // Convert character to integer and track the maximum
            if (maxi  int:
        # The result is simply the maximum digit in the string
        # We convert the characters to integers to find the max
        return int(max(n))

JavaScript

/**
 * @param {string} n
 * @return {number}
 */
var minPartitions = function(n) {
    let maxi = 0;
    for (let i = 0; i  maxi) {
            maxi = digit;
        }
        // Optimization: if we find a 9, we can stop early
        if (maxi === 9) return 9;
    }
    return maxi;
};

关键要点

  • 贪心思路: 数据集中的最大值往往决定了整个集合的需求。
  • 字符串操作: 对于超出标准整数范围的巨大数字(如 10^{100000}),应将其视为字符串处理。
  • 复杂度: 该解法的时间复杂度为 O(n)n 为字符串长度),额外空间复杂度为 O(1)

最后思考

这个问题在技术面试中会带来一个 “恍然大悟” 的时刻。它看似是动态规划或划分问题,实则是对观察力的考察。在实际的软件工程中,这类似于 资源分配:并行任务的总执行时间往往受单个最长任务的限制,就像我们的求和受最大数字的限制一样。

0 浏览
Back to Blog

相关文章

阅读更多 »

按组反转数组

问题描述:将数组按给定大小 k 分组后逆序。数组被划分为长度为 k 的连续块(窗口),每个块都被逆序。

‘skill-check’ JS 测验

问题 1:类型强制转换 以下代码在控制台会输出什么? javascript console.log0 == '0'; console.log0 === '0'; 答案:true,然后 false Ex...

不糟糕的语义失效

缓存问题 如果你在 Web 应用上工作了一段时间,你就会了解缓存的情况。你加入缓存,一切都变快了,然后有人……