1.惨痛的教训
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。
我们用cin>>s和scanf(%s)输入字符串时,会在接受完字符串后在末尾加个'\0',也就是NULL作为字符串结束符。
所以用strlen函数求解字符串长度的时候,复杂度就是O(n)。如果在循环中用
for (int i = 0; i < strlen(s); ++i)//复杂度O(n^2)
那就麻烦了,可能会超时,解决办法:
(1)先把strlen(s)先用变量存储起来,再放入循环中;
(2)或者用s[i] != '\0';
(3)或者用string s存储,用s.size(); 注意s.size()也是O(n)的,故用前要开临时变量记录一下
做poj1152的时候发现用i < s.size()和i < strlen(s)最终用时差不多。但是最好还是用前两种。
2.类似的还有sqrt函数
循环的时候要么先算出sqrt(x),要么就用i*i < x,最好不要用i < sqrt(x),增加复杂度。
其他的类似。
---------------------
作者:如雨星空
原文:https://blog.csdn.net/xxiaobaib/article/details/78228547