我需要帮助我在伪代码中的作业: 输入4个数字并打印最大3个数字的总和。
例如: 输入:14,1,9,3 输出:14 + 9 + 3 => 26
如何在上述任务的伪代码中编写算法?
到目前为止,我已经达到了这个目标:
input a, b, c, d
declare h1, h2, h3
if(a>=b && a>=c && a>=d) h1 = a
if(b>=a && b>=c && b>=d) h2 = b
if(c>=a && c>=b && c>=d) h3 = c
if(d>=a && d>=b && d>=c) h4 = d
print h1+h2+h3
这有什么好处吗?
答案 0 :(得分:3)
t
中。sum = t[0]
。min = t[0]
。i
从1到3重复步骤5和6:sum += t[i]
。if (min > t[i]) min = t[i]
。sum - min
。你和Brian提出的另一种方法归结为分类(对于n = 4你可以做到"手动"就像你做的那样,但对于更大的n来说它不是一个好主意)然后拿出总和。
我更喜欢上面显示的方法,因为它保证了线性时间复杂度,可以很好地扩展,并且易于实现。它完全通过输入数据传递,并且如果输入逐个流传输并且我们不想将输入存储在存储器中(我们想要这样做"在运行中&#) 34)。如果对输入数据没有任何假设,则排序可能比线性更昂贵(可以是nlogn)。
答案 1 :(得分:1)
你的伪代码是一个良好的开端。但是现在你只能找到四个数字中最大的一个。您需要重复两次(忽略最大值)才能找到第二和第三大。
另一个聪明的想法是,如果你需要3个最大的数字,你的第4个数字必须是最小的。找到最小的数字,然后添加其他数字。
input a, b, c, d
declare min
// find the smallest
min = a
if (b < min) min = b
if (c < min) min = c
if (d < min) min = d
// the sum of the largest 3 = the sum of all 4 minus the minimum
print a + b + c + d - min
答案 2 :(得分:1)
使用递归。如果输入中的第一个数字最小,则将其他三个相加,否则旋转输入并递归调用。最终,最小的数字将是a
,因此其他三个是最大的,您可以将它们相加并返回答案。在伪代码中:
function sum3max(a, b, c, d)
if a == min(a, b, c, d)
return b + c + d
return sum3max(b, c, d, a)