我试图运行此代码,但返回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";
}