Как определить порядок последовательности символов (без массивов!) В C - PullRequest
2 голосов
/ 12 октября 2011

Это то, чем я занимаюсь до сих пор

char max = 0, here;
while(scanf("%c", &here) == 1 && here != '\n')
    if(here > max)
        max = here;
printf("max='%c'\n", max);

Пользователь может ввести последовательность символов, и я верну букву с самым высоким значением ASCII. В Computer Fun это будет ты. Но если бы CompUter Fun было вводом, я бы хотел вернуть U, потому что он был введен первым в последовательности.

У меня могло бы быть две переменные, сохраняющие наивысшую заглавную букву и наивысшую простую букву, но как я узнал бы, что пришло первым?

Спасибо заранее. Объяснять логику просто замечательно, если вы не хотите записывать фрагмент кода, который делает это.

Ответы [ 2 ]

4 голосов
/ 12 октября 2011

Вам нужна только одна переменная - просто следите за символом, который выигрывает до этой точки.

Когда вы просматриваете ввод CompUter Fun, вы сначала видите C.Так как его первый персонаж, его победитель до сих пор.Тогда вы видите o.o идет после C, так что теперь он победитель;Ваша переменная теперь содержит o.И так далее.Вы заменяете сохраненный символ только в том случае, если новый выигрывает, поэтому вы получите первый в случае связей.

(При сравнении необходимо выполнять сравнение без учета регистра; простой способ сделать этоэто tolower по обе стороны от сравнения).

input  winner
C      C       # first letter always wins
o      o       # o > c
m      o       
p      p       # p > o
U      U       # U > o
t      U
e      U
r      U
       U       # space
F      U
u      U       # u == U, so !(u > U), so U stays winner
n      U

дает окончательного победителя, U.

Это эффективный общий алгоритм для нахождения максимума (или минимума, путемобратное сравнение) неупорядоченного ввода.Его также можно расширить, чтобы отслеживать 2-е (и т. Д.) Место, хотя в какой-то момент сортировка становится более эффективной, особенно в таких данных, где вы можете использовать радикальные сортировки O (n).

1 голос
/ 12 октября 2011

Вы можете просто использовать одну переменную, как у вас, но вместо того, чтобы просто проверять, находится ли здесь> max, он может проверить, является ли новое значение строчной или заглавной версией буквы, которая в данный момент находится в max. Таким образом, вы не будете перезаписывать текущий максимум, если придет новая буква равного значения.

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