当前位置: 首页 > 知识库问答 >
问题:

求满足一定性质的六位数的优化算法

楚冷勋
2023-03-14

问题:“一种计算六位数的算法,其中前三位数的和等于后三位数的和。”

我在一次采访中遇到了这个问题,想知道最好的解决方案。这就是我现在所拥有的。

方法1:暴力解决方案当然是检查每个数字(100000到999999之间)的前三位和后三位的总和是否相等。如果是,则递增某个计数器,该计数器记录所有此类数字。

但这检查了所有900,000个号码,因此效率低下。

方法2:既然我们被问到“有多少”这样的数字,而不是“哪些数字”,我们可以做得更好。将数字分为两部分:前三位(从100到999)和后三位(从000到999)。因此,候选数字的任何一部分中的三位之和可以从1到27不等。
*维护std::图

在这种方法中,我们最终检查1K数字。

我的问题是我们如何进一步优化?有更好的解决方案吗?


共有3个答案

马淇
2023-03-14

Python实现

def equal_digit_sums():
dists = {}
for i in range(1000):
    digits = [int(d) for d in str(i)]
    dsum = sum(digits)
    if dsum not in dists:
        dists[dsum] = [0,0]
    dists[dsum][0 if len(digits) == 3 else 1] += 1
def prod(dsum):
    t = dists[dsum]
    return (t[0]+t[1])*t[0]
return sum(prod(dsum) for dsum in dists)

print(equal_digit_sums())

结果:50412

束建章
2023-03-14

生成所有三位数;根据它们的位数之和将它们划分为多个集合。(实际上,你需要做的就是保留一个向量来计算集合的大小)。对于每个集合,可以生成的六位数的数量是集合的平方大小。将设定大小的平方相加得到答案。

int sumCounts[28]; // sums can go from 0 through 27
for (int i = 0; i < 1000; ++i) {
    sumCounts[sumOfDigits(i)]++;
}
int total = 0;
for (int i = 0; i < 28; ++i) {
    count = sumCounts[i];
    total += count * count;
}

编辑变量以消除计数前导零:

int sumCounts[28];
int sumCounts2[28];
for (int i = 0; i < 100; ++i) {
    int s = sumOfDigits(i);
    sumCounts[s]++;
    sumCounts2[s]++;
}
for (int i = 100; i < 1000; ++i) {
    sumCounts[sumOfDigits(i)]++;
}
int total = 0;
for (int i = 0; i < 28; ++i) {
    count = sumCounts[i];
    total += (count - sumCounts2[i]) * count;
}
万浩淼
2023-03-14

对于<代码>0

那么,对于第一部分

int first[28] = {0};
for(int s = 0; s <= 18; ++s) {
    int c = 10 - (s < 9 ? (9 - s) : (s - 9));
    for(int d = 1; d <= 9; ++d) {
        first[s+d] += c;
    }
}

这是19*9=171次迭代,对于后半部分,类似地进行,内部循环从0而不是1开始,这是19*10 = 190次迭代。然后为1求和first[i]*第二[i]

 类似资料:
  • 在过去的几天里,我一直在做一些事情,看起来像预期的那样,但是我在寻找改进的方法。我有一组n个项目,我需要将这些项目组合在一起,这些项目必须满足以下所有要求: A类2件 B类2件 C类2件 2个D类物品 E类1件 我目前正在使用以下递归方法将我的组放在一起,并且使用isValid()方法来确定该组是否符合标准。 当程序运行时,我能够看到有效的结果被打印出来,但是我正在处理的项目的原始大小可能远远超过

  • 本文向大家介绍算法 - 树的定义和性质,包括了算法 - 树的定义和性质的使用技巧和注意事项,需要的朋友参考一下 树是代表各个元素或节点之间的层次关系的离散结构。 父级不超过两个子级的树称为二叉树。 树及其属性 定义-树是一个连通的无环无向图。G中的每对顶点之间都有一条唯一的路径。顶点数为N的树包含(N-1)个边。0度的顶点称为树的根。1度顶点称为树的叶节点,内部节点的度至少为2。 示例-以下是树的

  • 注: 表示整数n的二进制表示中1的个数。 表示整数X和y的按位或。 表示整数X和y的按位异或。 无序数组元素对是对,其中1≤i

  • 每个代理都有一个私有布尔变量“Happy?”。如何用[Happy?=True]计算特工人数? 就餐时有没有直接的方法?或者我遍历了所有的代理,然后逐个计算? 更新: 我尝试过全局调度方法:https://repast.github.io/docs/RepastReference/RepastReference.html#schedule-全球的 当我使用ContextBuilder中的@schdu

  • 题目描述 这是今晚阿里巴巴笔试编程题的其中一道。原题描述如下: 对于任何整数 $x$,一定存在整数对 $(a, b)$,使得 $x \oplus a \oplus b$ 最大。其中,$\oplus$ 表示异或,$0≤x,a,b≤2^{31}-1$。给定一个 $x$,输出使得 $\vert a-b\vert $ 最小的 $(a, b)$ 对的个数。 示例: 输入 0,输出 2 输入 100,输出 1

  • 问题内容: 作者:ustchcl 问题答案: 可以通过第二个参数作为寄存值实现: