使用C查找两个数组中第一个相同的大写字母



我试图运行此代码,但返回NULL,哪个部分错了?正确的输出应该是"0";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("%sn", day("3485djDkxh4hhGE", "2984akDfkkkkggEdsb"));
return 0;
}

我看到您正在为s2中的每个字符运行内部循环,然后s2结束。在那之后,我们必须再次将s2重置为开头。因此,我将其存储在temp中,并在u为s1中的下一个字符开始时重置为s2。我测试了这个代码,并将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'];
}

@rootkonda的答案(https://stackoverflow.com/a/63259897/4386427)解释了代码不起作用的原因。我将讨论其他问题,并提出替代实施方案。

根据输入,您的代码有非法(又称未定义(行为。

如果输入是"aI""bI",您将执行:

return week['I' - 'A] 

哪个是

return week[8];

所以你访问数组是越界的。

如果两个字符串没有共同的大写字母,也会出现类似的问题。然后你做:

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

您的代码应该处理此类情况而不会失败。

如任务所述,唯一有效的标题字母是'A', 'B', ..., 'G'

您当前的代码为s1中的每个字母检查s2的内容。这导致了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";
}

最新更新