1.经典入门
1.1 排序
主要掌握:冒泡排序等常见排序方法,自带函数sort()以及自定义排序函数,重载操作符。
基本类型排序
sort函数:c++sort函数的使用总结
语法描述:
sort(begin,end,cmp),cmp参数可以没有,如果没有默认非降序排序。排序数据类型可以是int,float, double,string等。例如:sort(str.begin(),str.end())。
引入头文件,#include可修改默认排序规则
升序:sort(begin,end,less());
降序:sort(begin,end,greater()).
自定义cmp排序函数也可以实现。
#include <iostream>
#include <algorithm>
#include<functional>
using namespace std;
// 定义排序规则-降序(默认使用快排)
bool cmp(int x, int y) {
return x > y; // 当cmp返回true的时候,表示cmp第一个参数排在第二参数前面。
}
int main() {
int n;
int buf[100];
while (scanf_s("%d", &n) != EOF) { // scanf函数有返回值的,返回的是成功赋值的变量个数
for (int i = 0; i < n; i++) {
scanf_s("%d", &buf[i]); // scanf_s是scanf的安全形式
}
//1.冒泡升序:把较大值往后放
/*
for (int i = 0; i < n; i++) // 决定了下轮排序的总数
{
for (int j = 0; j < n - 1 - i; j++) //每轮总数少1,因为已经就位
{
if (buf[j] > buf[j + 1])
swap(buf[j], buf[j + 1]);
}
}
*/
// 2.默认sort(起点地址,重点地址),进行快排非降序
sort(buf, buf + n, greater<int>());
// 3.使用该重载形式,使用自己定义的排列规则
//sort(buf, buf + n, cmp);
for (int i = 0; i < n; i++) {
printf("%d ", buf[i]);
}
printf("\n");
}
return 0;
}
结构体排序
使用sort函数,修改cmp比较函数
struct E{
char name[101];
int age;
int score;
}
int cmp(E a, E b){
if(a.score != b.score) return a.score < b.score;//分数
int tmp = strcmp(a.name, b.name);//字符串比较函数
if (tmp != 0): return tmp < 0;//姓名
else return a.age < b.age;//年龄
}
使用操作符重载:
括号中的const表示参数a对象不会被修改,最后的const表明调用函数对象不会被修改!
可参考:C/C++对bool operator < (const p &a)const的认识,运算符重载详解(杂谈)
struct E{
char name[101];
int age;
int score;
//在结构体中重载操作符
bool operator < (const E &b) const{
if(score != b.score) return score < b.score;
int tmp = strcmp(name, b.name);
if (tmp != 0): return tmp < 0;
else return age < b.age;
}
}
//直接调用自带的sort函数不需要修改
sort(buf,buf+n)
1.2日期类问题
计算日期的天数差,以及日期对应的星期等问题。
日期差值
主要考虑平年和闰年的天数不一致,12个月的天数不一致。(闰年定义:能被400整除,或者,不能被100整除但能被4整除)
这里是考虑把5000年的日期间隔求出来,再根据给出的两个日期去除对应的日期间隔,再做差。内存要求有点大。
【注意】这样耗费内存的数组需要定义为全局变量,或者使用动态分配malloc函数,如果定义在main()函数之内,可能出现栈溢出的问题。
星期问题
求给定日期的星期。这类问题可以转换为日期差值的问题。步骤:
- 知道今天的日期,星期几;
- 求给定日期和今天的差值;
- 根据星期是按照7天进行循环,求出给定日期的星期即余数。
1.3 Hash的应用
这里对Hash的应用相当于一个计数数组的概念,相当于直接把整数值作为数组的下标。这里可以得到每个值出现的次数。同时,Hash这种思想也可以用来排序,那么我们在计数时,每个都赋值为1,然后按照地址输出值为1的地址即是排序后的数据。
#include <iostream>
#include <cstring>
using namespace std;
int score[105];
int main() {
int n, s;
while (scanf_s("%d", &n) != EOF) {
memset(score, 0, sizeof(score));// 对一段内存空间初始化
while (n--) {
cin >> s;
score[s]++;
}
cin >> s;
printf("%d\n", score[s]);
}
return 0;
}
1.4 排版题
这类题主要考察对输出格式的把握。
这类题要注意图形的规律,网络考虑从上至下,从做至右应用规律。有时可以先完成排版再输出。
1.5 查找
重点掌握二分法。
二分法本身比较简单,但是针对的是有序的数据,所以可能需要先进行前面提到的排序操作。此外,二分法的另外一个应用是定界。因为二分之后,能够确定中间位置。快速排序的划分算法也有类似的好处。
1.6 贪心算法
贪心算法就是每次都选择当前情况下的最优解,但是很可能得到的是局部最优,并不是全局最优。这个要根据具体题目进行使用。
参考:
https://blog.csdn.net/fuxuemingzhu/article/details/82946423
https://blog.csdn.net/beashaper_/article/details/80746601