strlen(),gets()和getchar()的更深理解

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 

全部评论

相关推荐

白火同学:1、简历可以浓缩成一页,简历简历先要“简”方便HR快速过滤出有效信息,再要“历”用有效信息突出个人的含金量。 2、教育背景少了入学时间~毕业时间,HR判断不出你是否为应届生。 3、如果你的平台账号效果还不错,可以把账号超链接或者用户名贴到对应位置,一是方便HR知道你是具体做了什么内容的运营,看到账号一目了然,二是口说无凭,账号为证,这更有说服力。
面试被问期望薪资时该如何...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务