《计算机考研-机试指南》- 1经典入门

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()函数之内,可能出现栈溢出的问题。

星期问题

求给定日期的星期。这类问题可以转换为日期差值的问题。步骤:

  1. 知道今天的日期,星期几;
  2. 求给定日期和今天的差值;
  3. 根据星期是按照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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值