在不使用数组/向量的情况下计算数字序列的模式

时间:2010-02-22 17:11:25

标签: algorithm matlab

我是MATLAB课程入门的TA,该课程尚未学习数组的使用(或在MATLAB,向量中)。有一个考试即将开始,学习指南中的一个问题如下:

[难题]模式是序列中出现次数最多的数字。提示用户一个接一个地以非递减顺序输入一系列非负数。用户通过输入负数来指示序列的结束。编写脚本以获取此类用户输入并确定序列的模式。如果有多种模式,您可以将其中任何一种模式报告为模式。不要使用数组。下面是一个示例运行:

Determine mode of a set of nonnegative integers.
Use a negative number to quit.
Give me a number:  70
Another number not smaller than the previous: 71
Another number not smaller than the previous: 80
Another number not smaller than the previous: 80
Another number not smaller than the previous: 80
Another number not smaller than the previous: 91
Another number not smaller than the previous: 93
Another number not smaller than the previous: -1
  Mode is 80.

我一直在考虑它,但我无法想出一个好的解决方案。 有谁知道是否有一个很好的方法来解决这个问题?

我能想出的唯一解决方案是丑陋的黑客攻击,试图通过其他方式模拟数组的使用,例如使用带分隔符的字符串来模拟类似字典的对象。

4 个答案:

答案 0 :(得分:7)

这里的关键点是“另一个不小于前一个的数字:”。这意味着输入序列始终是有序的,如果有相同的数字,它们必须彼此相邻。假设只需要1种模式,使用变量current_mode_so_farfrequency_of_current_modeinputfrequency_of_input来推断它应该是微不足道的。

答案 1 :(得分:5)

线索:由于输入序列处于非递减顺序,因此当您看到一个大于80的数字时,知道(在您的示例中),您永远不会再看一次80。所以在这一点上你确切知道序列中有多少80个。

也许你可以记住这个数字和线索在这里结束

答案 2 :(得分:1)

您实际上并不需要存储整个值(即数组或向量)。

由于元素以单调的方式出现,你只需要保持迄今为止看到的模式(以及它出现的次数)。如果新元素超过当前模式,只需将其替换为计数。

答案 3 :(得分:1)

这样的事可能有用:

num = input('Give me a number: ');
mode = num;
prev = num;
n = 1;
bestn = -1;

while num > 0
    num = input('Another number not smaller than the previous: ');
    if num > prev
        %New number
        if n > bestn
            %New mode
            bestn = n;
            mode = prev;
        end
        n = 1;
    else
        n = n +1;
    end
    prev = num;
end

fprintf('Mode is %d',mode);