#arrays #c #duplicates
Вопрос:
Я создаю программу, которая требует от пользователя ввода аргумента (argv[1]), где аргументом является каждая буква алфавита, переставленная так, как это нравится пользователю. Примерами допустимых входных данных являются «YTNSHKVEFXRBAUQZCLWDMIPGJO» и «JTREKYAVOGDXPSNCUIZLFBMWHQ». Примерами недопустимого ввода будут «VCHPRZGJVTLSKFBDQWAXEUYMOI» и «ABCDEFGHIJKLMNOPQRSTUYYYY», поскольку в соответствующих примерах есть дубликаты » V » и «Y».
Что я знаю до сих пор, так это то, что вы можете просмотреть весь аргумент следующим образом
for (int j = 0, n = strlen(argv[1]); j < n; j )
{
//Place something in here...
}
Однако я не совсем знаю, будет ли это правильным путем при поиске дубликатов? Кроме того, я хочу, чтобы ответ был как можно более простым, я знаю, что время и загрузка процессора не являются приоритетом, поэтому «лучший» алгоритм не обязательно тот, который я ищу.
Комментарии:
1. В конечном итоге вам потребуется проверить каждый отдельный символ ввода, поэтому для начала неплохо было бы просмотреть их все.
2. Как бы вы это сделали, если бы вам вручили листок бумаги с указанной последовательностью символов, и все, что у вас было, — это еще один лист бумаги и карандаш? Ответьте на это, и у вас будет один (из нескольких) возможных алгоритмов.
3. Самый простой вариант, на мой взгляд, — это вариант использования switch(arg[i]) { регистр ‘A’: int x ; перерыв; и так далее в алфавитном порядке.
4. n = strlen(argv[1] не работает. n=0.
Ответ №1:
предполагая, что все ваши буквы написаны заглавными буквами, вы можете использовать хэш-таблицу, чтобы заставить этот алгоритм работать O(n)
со сложностью во времени.
#include<stdio.h>
#include<string.h>
int main(int argc, char** argv){
int arr[50]={};
for (int j = 0, n = strlen(argv[1]); j < n; j )
{
arr[argv[1][j]-'A'] ;
}
printf("duplicate letters: ");
for(int i=0;i<'Z'-'A' 1;i ){
if(arr[i]>=2)printf("%c ",i 'A');
}
}
здесь мы создаем массив arr
, инициализированный нулями. этот массив будет вести учет вхождений каждой буквы.
а затем мы ищем буквы, которые появлялись 2 или более раз, это дублированные буквы.
Также, используя тот же массив, вы можете проверить, все ли буквы встречались хотя бы один раз, чтобы проверить, является ли это перестановкой
Ответ №2:
Попробовать это.
#include <stdio.h>
#include <stddef.h>
int main()
{
char * input = "ABCC";
size_t ascii[256] = {0, };
char * cursor = input;
char c = '';
while((c=*cursor ))
{
if(ascii[c] == 0)
ascii[c];
else
{
printf("Find %c has existed.n", c);
break;
}
}
return 0;
}
Ответ №3:
Я не знаю, тот ли это тип кода, который вы ищете, но вот что я сделал. Он ищет дубликаты в данном наборе строк.
#include <stdio.h>
#include <stdlib.h>
#define max 50
int main() {
char stringArg[max];
int dupliCount = 0;
printf("Enter A string: ");
scanf("%s",stringArg);
system("cls");
int length = strlen(stringArg);
for(int i=0; i<length; i ){
for(int j=i 1; j<length; j ){
if(stringArg[i] == stringArg[j]){
dupliCount =1;
}
}
}
if(dupliCount > 0)
printf("Invalid Input");
printf("Valid Input");
}