Расчет режима последовательности чисел без использования массивов / векторов - PullRequest
3 голосов
/ 22 февраля 2010

Я учусь на курсе Введение в MATLAB, и класс еще не изучил использование массивов (или в 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 ]

7 голосов
/ 22 февраля 2010

Ключевым моментом здесь является «Еще одно число не меньше предыдущего:». Это означает, что входная последовательность всегда сортируется, и при наличии равных чисел они должны появляться рядом друг с другом. Предположим, что необходим только 1 режим, и вывести его с помощью переменных current_mode_so_far, frequency_of_current_mode, input и frequency_of_input.

довольно просто.
5 голосов
/ 22 февраля 2010

Подсказка: поскольку последовательность ввода находится в неубывающем порядке, вы знаете , что (в вашем примере), увидев число больше 80, вы никогда не увидите 80 снова. Таким образом, в этот момент вы точно знаете, сколько 80 с в последовательности.

Возможно, вы могли бы вспомнить это число, и подсказка заканчивается здесь

1 голос
/ 22 февраля 2010

Примерно так может работать:

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);
1 голос
/ 22 февраля 2010

Вам не нужно хранить целые значения (то есть массив или вектор).

Поскольку элементы имеют монотонный характер, вы просто сохраняете видимый режим (и сколько раз он появлялся). Если новый элемент обгоняет текущий режим, просто замените его и количество.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...