注:本题解中所有的代码均已测试,请读者放心阅读
这一次我想换个思路,由我错误的代码来引入这篇题解,帮助大家来理解这个时间问题,
1.cin和c语言中的scanf输入数据的耗时差距比较大
scanf是用指针操作的,没有类型安全机制。比如一个char类型数据你就可以用%f获得输入,而不会报错,但在运行时会出现异常。
cin是自动判断你的变量类型,比如一个char数据只能用默认的char方法取数据。
标准流对象cin/cout为了普适性,继承体系很复杂,所以在对象的构造等方面会影响效率,因此总体效率比较低。
cin有许多额外的开销,可以用std::ios::sync_with_stdio(false)或ios::sync_with_stdio(false);cin.tie(0);,这样就可以取消cin于stdin的同步了。
2.最后的清空map很重要(这个是我导致worng Answer67%的原因)
这个就不多说了,就是最后的a.clear()的问题,因为如果最后不清除的话,上次样例会一直存在map中,影响后面的判断;
3.采用迭代器遍历一定要考虑时间问题(这是最重要的)
前两个的时间复杂度都明显低于最后一个,我去网上搜题解的时候不知道为什么有的大神用第三种还能写对,在下佩服,我就好奇的粘了一个测试发现,额
这不是坑人吗?不试试的话,还真挺对的,哈哈,言归正传哈,咱下面就来分析题解思路;
这个思路呢分为两种,这第一种呢,就是第一张图片上用count的那个
大题思路就是:咱不是要寻找元素吗,我直接a.count(要寻找的字符串),如果在map中没找到的话,那么这个返回值就是0了,count顾名思义是数量,以返回值为条件进行判断再输出对应的结果,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
这第二种呢就剩find函数了,这里还要拓展一下map容器中find函数的返回值问题,
map的find(s)成员,目的是在map中查找关键字s的pair,找到后返回指向关键字为s的pair的迭代器,找不到那么就会返回尾后迭代器,切记迭代器其实就是一个指针,用迭代器访问pair的first或者second成员方法是:iter->first 或 iter -> second,不能用.号。(原文链接:https://blog.csdn.net/digitalkee/article/details/122731329)。
这里要注意几点:1.要查找的字符串一定要为map的关键字(key),即要查找的字符串所在的那一类为key,这个地方很好设,在构造函数map的时候颠倒输入的赋值顺序就好了;2.find函数未找到的时候返回的是a.end(),所以要给find初始化为一个迭代器变量,再进行查找。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
|
以上就是我对本体的片面的理解,希望与大家共享。
记录当下,我的编程之路。