Найдите первую такую ​​же заглавную букву в двух массивах, используя C - PullRequest
0 голосов
/ 05 августа 2020

Я пытался запустить этот код, но получил NULL, какая часть неверна? Правильный вывод должен быть «THU», потому что «D» - четвертая заглавная буква.

Вот полный код:

#include <stdio.h>

char *day(char* s1, char* s2) {
    char* week[] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};
    int stop = 1;
    char ans = 0;

    while (*s1 && stop) {
        while (*s2) {
            if (*s1 == *s2 && *s1 >= 'A' && *s1 <= 'Z') {
                ans = *s1;
                stop = 0;
                break;
            }
            s2++;
        }
        s1++;
    }

    return week[ans - 'A'];
}

int main(void) {
    printf("%s\n", day("3485djDkxh4hhGE", "2984akDfkkkkggEdsb"));
    return 0;
}

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

Я вижу, вы запускаете внутренний l oop для каждого символа в s2, а затем s2 заканчивается. После этого нужно снова сбросить s2 в начало. Следовательно, я сохранил его в temp и сбрасывал на s2 при запуске для каждого следующего символа в s1. Я проверил этот код и на выходе вижу THU.

 char* day(char* s1, char* s2)
    {
    char* week[7] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};
    int stop = 1;
    char ans = 0;
        char* temp = s2;
    while (*s1 && stop) {
        while(*s2) {
            if (*s1 == *s2 && *s1 >= 'A' && *s1 <= 'Z') {
                ans = *s1;
                stop = 0;
                break;
            }
            s2++;
            cout << *s2 <<endl;
        }
        s1++;
        s2=temp;
    }
    return week[ans - 'A'];
    }
0 голосов
/ 05 августа 2020

Ответ от @rootkonda ({ ссылка }) объясняет, почему код не работал. Я рассмотрю другие проблемы и предложу альтернативную реализацию.

В зависимости от ввода ваш код имеет недопустимое (иначе неопределенное) поведение.

Если ввод - "aI" и "bI" , вы сделаете:

return week['I' - 'A] 

, что составляет

return week[8];

Таким образом, вы получаете доступ к массиву за пределами границ.

Аналогичная проблема возникнет в случае, если две строки не имеет общей заглавной буквы. Затем вы делаете:

return week[0 - 'A'];  // bad....

Ваш код должен обрабатывать такие случаи без сбоев.

В соответствии с описанием задачи единственными допустимыми заглавными буквами являются 'A', 'B', ..., 'G'.

Ваш Текущий код проверяет содержимое s2 для каждой буквы в s1. Это приводит к сложности O (N ^ 2), то есть к низкой производительности для длинных строк, когда соответствующая заглавная буква приближается к концу s1.

Ниже приводится предложение, которое сначала анализирует s1 и генерирует табло для заглавных букв. Затем он анализирует s2, используя табло. Сложность O (N).

char *day(char* s1, char* s2) 
{
    char* week[7] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};

    int capitalLettersFound[7] = {0};  // Scoreboard for 'A' .. 'G'
    
    while (*s1) 
    {
        if (*s1 >= 'A' && *s1 <= 'G') 
        {
            // Update scoreboard
            capitalLettersFound[*s1 - 'A'] = 1;
        }
        ++s1;
    }
    
    while (*s2) 
    {
        if (*s2 >= 'A' && *s2 <= 'G' && capitalLettersFound[*s2 - 'A'] == 1) 
        {
            // Match found - return string
            return week[*s2 - 'A'];
        }
        ++s2;
    }

    // No match found
    return "No matching capital letters found";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...