一、排序
1.设计的算法时间复杂度不能超过百万级。
2.输入格式问题
while(scanf("%d",&n)!=EOF) 利用scanf的返回值测试是否还有有效输入
若为字符串,则用while(gets(字符串变量))
3.利用C++的库函数完成排序
需要的头文件: #include<algorithm>
using namespace std;//声明会使用标准命名空间(sort)就在其中
调用样例 sort(a,a+n);
自定义cmp函数,实现降序排序
当cmp的返回值为真时,则函数的第一个参数会排在第二个参数之前
样例:bool cmp(int x,int y){
return y>x;
}
sort(a,a+n,cmp);
4.结构体排序
4.1字符串比较
需要的函数 strcmp(s1,s2); 按照两个字符串的每个字符ASCII码排序
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str2 小于 str1。
如果返回值 = 0,则表示 str1 等于 str2
需要的头文件 #include<string.h>
4.2利用结构体的重载算符比较
bool operator < (const E &A) const{//A为第二个对象,const为表示不会修改对象
同cmp
}
二、日期问题
1.相差几天问题
一开始我想的是两个日期比较相差几天,但是这种解法需要包括多种情况。比较适合的方法是将各个日期从同一起点的天数计算出来再作差。
scanf("%4d%2d%2d",&y1,&m1,&d1);可以读取指定位数
#define is2year(x) x%100!=0&&x%4==0||x%400==0?1:0 闰年的判断
y/4-y/100+y/400 闰年的总数
二维数组存储每个月天数
2.指出是星期几的问题
跟上一个问题大同小异,说说不同点和解题遇到的坑。
二维char数组存储每个月份、星期的名称
如char a[13][20],若想调用如“Monday”,只需要 a[1];再用strcmp与输入的s比较,保存星期几的序号
来说说我做题遇到的一个坑,由于刚做完上一道题(求两天的差值),用的是abs,这题我则如法炮制,求出各自距离0年1月1日的天数,在加上已知今天是星期几,再把两者的天数做差,加上今天的星期作取余运算。但是结果一直对不上,排查了很久,想到了队列的循环列表才发现自己忽略答案的双向问题。
我认为第一题求的答案相当于一个点,没有正负,第二题则是在一个坐标轴的方向求值,因此需要考虑正负。
days+=3;
puts(dayname[(days%7+7)%7]); //输出字符串并换行
先对差值取模保留正负,然后+7保证不存在负数再取余
三、哈希表
1.哈希表存储可能性然后计数。a[101]={0};//数组初始化为0
2.
用排序算法时间复杂度达到千万数量级,但是题目告诉了区间,因此用hash的方法。需要注意的点,数组不能为负5000000,因此要做偏移处理。
四、排版题
1.规律顺序与输出顺序一致,简单。
2.规律顺序与输出顺序的关系比较复杂,先利用一个数组缓存,进行排版,然后再输出数组。
注意读取char的时候对getchar()的使用,还有对循环层数的确认。
五、查找
熟悉二分查找。
六、贪心算法
注重是否为最优解的证明