我是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.
我一直在考虑它,但我无法想出一个好的解决方案。 有谁知道是否有一个很好的方法来解决这个问题?
我能想出的唯一解决方案是丑陋的黑客攻击,试图通过其他方式模拟数组的使用,例如使用带分隔符的字符串来模拟类似字典的对象。
答案 0 :(得分:7)
这里的关键点是“另一个不小于前一个的数字:”。这意味着输入序列始终是有序的,如果有相同的数字,它们必须彼此相邻。假设只需要1种模式,使用变量current_mode_so_far
,frequency_of_current_mode
,input
和frequency_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);