函数说明
reverse()
:翻转数的范围[first,last)
memset( void *dest, int ch, size_t count )
:单位是1Byte。
dest - 指向要填充的对象的指针;
ch - 填充字节;
count - 要填充的字节数;
一般只用ch=0(各个位全0)/ch=-1(各个位全1)。
b.pop_back();
:删除最后一个字符(这就是一个完整的语句)
s.substr(i, len)
:返回字符串s第从第i个字符开始,长度为len的字符串;默认i = 0,len = s.size()。
小常识积累
1.函数外定义的变量(全局变量)存放在堆空间,其默认值都是0。
原因:在申请堆空间时,不会你申请就给你开辟,只会将那片空间全部置零以标记(零页)。
2.函数内定义的变量(局部变量)存放在栈空间,值都是随机的。
原因:在申请时就会直接把栈空间分配给你,不进行初始化分配给你栈空间里的值就是原始内存空间里的值(脏数据),所以是随机的。
3.int类型整数的范围最大只到21亿(大概2×109)。
667 游戏时间
·输出一串字符串混杂数字的时候,用printf()
更方便一点。
·写出最直给的逻辑代码之后应该想想有没有能合并的项来减少不必要的代码,像本题里的ab相等情况和a>b情况可以合并写。
·输出结果有多种情况时,可以用一个变量(res)来代指,这样就只用写一次printf()
函数了。
669 加薪
·if ()
判断的范围,题目已给的输入范围已经限定了x >= 0 所有第一个区间只需限定右侧取值。
同样对于else if ()
,也只需要限定区间右侧取值,左侧已被第一个区间限定好了。
662 点的坐标
·这一题if-else
算是比较复杂的一个。
666 三角形类型
·a、b、c排列要满足a >= b>= c。
·不满足等边时,再验证是否等边,由于a>b>c,验证等腰只要判断a==b||b==c。(若a=c,一定等边)。
712 正数
要循环的过程是:读取数据+判断是否为正。
721 递增序列
·scanf()
读到结束符会返回-1,cin
读到结束符会返回false。
·~X
等价于表达式X != -1
(后面位运算会说)
·理解三种不同输入都对的原因。
710 六个奇数
·先把x变成奇数,从x开始输出6个奇数
713 区间2
·当只想循环n次并且循环结束后n没有其他用处时,可以用语句while(n--)
(先判断n的值,然后–)
725 完全数
·本题由于X的取值范围很大,如果直接完整遍历就会出现TLE。
·TlE之后的优化思路要记住:
X的约数一定是成对存在的(弱国i是X的约数,那么X/i也一定是X的约数),故只需要确保把每一对约数中小的那个遍历完就可以了,i从1开始遍历,依次遇到的约数i满足i<X/i(即i*i<X)便继续遍历。
·对所有约数求和时分为:
Sum+=i
确保所加不包含X本身,限制i<X
Sum+=X/i
确保i=X\i这种不被重复加,限制i!=X/i
确保X本身不被加,限制X/i<X
726 质数
·跟题目725是一样的优化思路。
727 菱形
·规律:每个点和中心点的曼哈顿距离
741 斐波那契数列
·int的范围最大只到21亿(2x10^9),如用int此题斐波那契数列的值在后面是会溢出的。
756 蛇形矩阵
·利用偏移量来搜索的方法
763 循环相克令
·把三种出法对应成三个数字,可以发现玩家二赢玩家一的规律。
772 只出现一次的字符
·计算各个字符的出现次数的思路:新建一个数组,数组的每个变量分别对应计算26个字母的出现次数。
·在一个函数中,无论何处出现return **
都会直接结束这个函数。
773 字符串插入
·得到字符串的连续某一段可调用成员函数*.substr(起始位置,长度)
参考链接
770 单词替换
·这题解中使用了新的字符串文件读入流stringstream
。
771 字符串中最长的连续出现的字符
·这里使用了第一类双指针的想法。
774 最长单词
·积累string类的两个函数 string str;
str.back()
:可以得到字符串str的最后一个字符。
str.pop_back()
:可以删除字符串str的最后一个字符。
775 倒排单词
·字符串数组连续读入的写法。
776 字符串移位包含问题
·循环移位的写法:a = a.substr(1) + a[0];
·这种暴力解法是理解kmp的基础。