我必须找到句子是pangram(Pangrams是通过使用字母表的每个字母构造的句子至少一次)或不是
由于超时而终止。为什么我觉得好吗?如何思考工作。我在hackerrank上使用它。吨
请告诉我们用逻辑推理解决什么是更好的方法。这太多了,但PLZ帮助:)。
这是我能做的最好的PLZ帮助我..提前感谢,如果程序中出现重大错误
#include <stdio.h>
int main()
{
int i,n=0,l;
char str[1000];
scanf("%[^\n]%*c",str);
for(l=65;i<91;l++)
{
for(i=0;str[i]!='\0';)
{
if(l==str[i]&&l+31==str[i])
{
n++;
}
if(str[i+1]=='\0')
{ i=i+2;
}
else
i++;
}
}
if(n==26)
printf("pangram ");
else
printf(" not pangram ");
return 0;
}
答案 0 :(得分:1)
修改您的代码如下:
int a[27];count=0;
for(k=0;k<27;k++)
a[k]=0;
for(i=0;str[i]!='\0';i++)
{
if(str[i]>96 && str[i]<123)
a[str[i]-96]++;
else if(str[i]>64 && str[i]<91)
a[str[i]-64]++;
}
for(k=1;k<27;k++)
if(a[k]>0)
count++;
if(count==26)
printf("panagram");
答案 1 :(得分:1)
你有错字
for(l=65;i<91;l++)
应该是
for(l=65;l<91;l++)
另一个可以调用UB的问题是代码
if(str[i+1]=='\0')
{
i=i+2;
printf(".-----------%d --- %c\n", i, str[i]);
}
请注意for(i=0;str[i]!='\0';)
这意味着每次找到null
终结符时都会继续,直到找到"\0\0"
的序列。这将导致UB因为str
未被引用而且str
1000
长DELETE n1
FROM dummyuser1 n1, dummyuser1 n2
WHERE n1.id > n2.id and n1.name = n2.name;
。
答案 2 :(得分:1)
我建议采用更简单快捷的方式
#include <stdio.h>
#include <ctype.h>
int main(void) {
char str[1000];
scanf("%s", str);
int c[26] = {0}, ans = 1;
for (int i = 0; str[i]; ++i)
if (isalpha(str[i])) // Only if alphabet
c[tolower(str[i]) - 'a']++;
for (int i = 0; i < 26; ++i)
if (!c[i]) { // Break if not pangram
ans = 0;
break;
}
printf(ans ? "pangram" : "not pangram");
return 0;
}
时间复杂度 O(字符串长度+常量)