int foo(char *str)
{
char *p = str;
while (p && *p!='\0' &&
((*p >= 'a' && *p <= 'z')
|| (*p >= 'A' && *p <= 'Z') || *p == '@')) {
p++;
}
return p-str;
}
上述复杂while
语句的时间和空间复杂度是多少?是否取决于in-en-close中的陈述
while (p && *p!='\0' && ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z') || *p == '@'))
或仅限于while
正文
while(){
//body statements
p++;
}
如上所述。它也取决于&&
或||
的短路。
答案 0 :(得分:1)
我不知道您的运行时或空间复杂性,但实际条件复杂性可以简化很多,以使其更具可读性。首先,您不必每次循环检查指针p
,首先检查str
是否为单独检查中的非空指针。其次,您应该使用isalpha
来检查字母。
所以代码看起来像这样:
int foo(char *str)
{
if (str == NULL)
return 0;
char *p = str;
while (*p != '\0' && (isalpha(*p) || *p == '@'))
p++;
return p - str;
}
使用isalpha
可以帮助您解决问题评论中提到的问题,即使您的语言区域已更改也能正常运行。
答案 1 :(得分:0)
当你谈到复杂性时,你在谈论它根据输入的大小增长了多少。在这种情况下,它基于作为str
传入的字符串的大小。在while条件下检查的内容数量不会改变。它固定在算法中,即所谓的“常数因子”,所以我们不计算它。因为在最坏的情况下,测试在字符串的每个字符上运行一次,它是O(n)
,其中n
是字符串的长度。