机试复习-3

前言:前面耽误太多时间,2月份是代码月,一定抓紧赶上,每天至少两道题

day1 2024.2.6

1.排序开启:

1.机试考试:排序应用考察

c的qsort     c++的sort

作用:对数组,vector排序;自定义排序规则

#include<algorithm>

2.注意:arr是数组名,当他作为函数参数时,会退化成数组首地址

(1)静态动态数组排序

上图就是对数组进行排序

(2)自定义方式排序、说明我们现在目标就是设计compare,compare可以设计出任何类型

(3)compare是我们的关键部分

返回bool类型;它的参数类型和原来数组类型一致

compare函数内容:当数据不会发生交换时候,返回真

比如我们想要升序:左>又

2.奇偶整数排序

1.题目:3446. 整数奇偶排序 - AcWing题库

2.思路:不就是设计compare吗,那我第一次先把奇偶分开,第二次排序奇数,第三次排序偶数

老师思路

3.代码

//题目:给10个数,把这十个数排序,先输出奇数,降序;再输出偶数,升序
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
bool compare1(int lf, int rt)
{
	return lf % 2 == 1 && rt % 2 == 0;//先把奇偶分开
}
bool compare2(int lf, int rt)
{
	return lf % 2 == 1 && rt % 2 == 1 && lf > rt;
}
bool compare3(int lf, int rt)
{
	return lf % 2 == 0 && rt % 2 == 0 && lf < rt;
}
int main()
{
	int a[10];
	for (int i = 0; i < 10; i++)cin >> a[i];
	//现在排序
	//先去写compare
	sort(a, a + 10, compare1);现在他是先输出奇数,在输出偶数
	sort(a, a + 10, compare2);
	sort(a, a + 10, compare3);
	for (int i = 0; i < 10; i++)cout<< a[i]<<' ';
}

3.成绩排序

1.题目:

2.思路:自定义类型,别用map,struct可好用了,定义student类型的数组student t[1000]={0};就好了;然后就是写compare函数,可太好写了,一遍过

3.代码:

/*给定学生的成绩单,成绩单中包含每个学生的学号和分数,
请将成绩单按成绩从低到高的顺序重新排序。
如果学生的成绩相同,则按照学号从小到大的顺序进行排序。*/
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
/*bool compare1(int lf, int rt)
{//既然是有学号有成绩,两个东西,那就用map
	//map.entryset()是取值的意思
	return lf < rt;
}
bool compare2(int lf, int rt)
{//既然是有学号有成绩,两个东西,那就用map
	//map.entryset()是取值的意思
	return lf <= rt;
}
int main()
{
	int n; cin >> n;
	map<int, int> map1;
	int si, sc;
	for(int i=0;i<n;i++){//现在输入了全部的
		cin >> si >> sc;
		map1.insert({ si,sc });
	}
	map<int, int>::iterator it;
	//取出成绩,进行sort
	sort(map1.begin()->second, map1.end()->second, compare1);

	for (it=map1.begin();it!=map1.end();it++)
	{
		if(it->second==it->second)
	}

}*/
typedef struct student
{
	int number;
	int score;
}student;
bool compare(student lf, student rt)
{
	return lf.number != rt.number && lf.score < rt.score || lf.number < rt.number && lf.score == rt.score;
}
int main()
{
	int n; cin >> n; student t[1000] = { 0 };
	for (int i = 0; i < n; i++)cin >> t[i].number >> t[i].score;
	sort(t, t + n, compare);
	for (int j = 0; j < n; j++)cout << t[j].number << ' ' << t[j].score << '\n';
}

是不是这题太简单了,还是我能力提高了

明天加油

day2 2024.2.7

1.成绩排序2

难点:①里面含有name,不知道sort里面咋写②要求稳定排序

尼玛的,这样的话compare里面就应该是student为参数呀!!!!!!!!!

稳定性如何搞?结构体里加上sep,compare里面加上seq的判断

/*给定学生的成绩单,成绩单中包含每个学生的姓名和分数,
请按照要求将成绩单按成绩从高到低或从低到高的顺序进行重新排列。*/
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct student
{
	char name[20];
	int score;
	int seq;
}student;
bool compare1(student l,student r)//你妈的
{
	return l.score > r.score|| l.score == r.score&&l.seq<r.seq;
}
bool compare2(student l, student r)
{
	return l.score < r.score || l.score == r.score && l.seq < r.seq;
}
int main()
{
	//使用struct结构体
	int n; cin >> n;
	int tag;		student t[1000] = { 0 };
	cin >> tag;//0是降序;1是升序
	for (int k = 0; k < n; k++)t[k].seq = k;
	for (int i = 0; i < n; i++)
	{//输入每个学生
		cin >> t[i].name >> t[i].score;
	}
	if (tag == 0)sort(t, t + n, compare1);
	if (tag == 1)	sort(t, t + n, compare2);
	for (int j = 0; j < n; j++)
	{
		cout << t[j].name <<' '<< t[j].score << '\n';
	}
}

2.特殊排序 用了10min+

就这???????

没啥的,就排一次嘛,有啥呀

代码

/*输入一系列整数,将其中最大的数挑出(如果有多个,则挑出一个即可),
并将剩下的数进行排序,如果无剩余的数,则输出-1。*/
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
bool compare(int l, int r)
{
	return l < r;
}
int main()
{
	//先输入
	int n; cin >> n; int a[10000] = { 0 };
	for (int i = 0; i < n; i++)cin >> a[i];
	//先排序
	sort(a, a + n, compare);
	cout << a[n - 1] << '\n';
	//现在已经排序好了,只需要把前n-1个数输出即可
	if (n == 1) cout<<-1;
	if (n > 1) {
		for (int j = 0; j < n - 1; j++)
		{
			cout << a[j] << ' ';
	} }
}

3.小白鼠排序:简单的不想理他

不到十分钟就好了

真无语

就是结构体内排序,自定义结构体

没有任何技术含量

代码

/*N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子。
现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色。
帽子的颜色用“red”,“blue”等字符串来表示。
不同的小白鼠可以戴相同颜色的帽子。白鼠的重量用整数表示。*/
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct mouse
{
	int wei;
	char color[10];
}mouse;
bool compare(mouse l,mouse r)
{
	return l.wei > r.wei;
}
int main()
{
	int n; cin >> n; mouse m[1000];
	for (int i = 0; i < n; i++)
	{
		cin >> m[i].wei >> m[i].color;
	}
	sort(m, m + n, compare);
	for (int j = 0; j < n; j++)
	{
		cout << m[j].color<<'\n';
	}
}

day3 2024.2.15 春节结束

1.奥运奖杯

没做完

2.找x,到查找了

就你输出东西的时候别输出字符-1,就设置一个变量专门存放结果的,没有就是-1,有就有

/*输入一个数n,然后输入n个数值各不相同,再输入一个值x,
输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。*/
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
	int n; cin >> n;//那个回车不用打印?不用!!!!!!!!!!
	int a[1000] = { 0 };
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}//输入完成
	int m; cin >> m; int j; int c = -1;
	for ( j = 0; j < n; j++)
	{
		if (a[j] == m)  c = j;
	}
	cout << c;
}

2.二分查找

1.思路就和以前一样

前提一定要先排序,使用algorithm的sort函数

2.代码

/*给定一个长度为 n的数组 a1,…,an和一个长度为 m的数组 
 b1,…,bm,对于每一个 bi,请你查找其是否在数组 a 中出现过。*/
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	//先输入
	int a[1000] = { 0 }, b[1000] = { 0 }; int i, j,s=0;//s是在不在里面的标志
	int n; cin >> n;
	for (i = 0; i < n; i++)cin >> a[i];
	int m; cin >> m;
	for (i = 0; i < m; i++)cin >> b[i];
	//两层循环,对b内的每一个数字在a里折半查找
	//错因:没有排序
	sort(a, a + n);
	for (i = 0; i < m; i++)
	{//此次是对b[i]在a中查找
		int l = 0, r = n - 1;//分别在a的左右两边
		while (l <= r)
		{
		int mid = (l + r) / 2;
		if (a[mid] == b[i]) { cout << 'Y'<< 'E' << 'S' << '\n'; s = 1; break; }
		else if (a[mid] > b[i])r = mid - 1;
		else l = mid + 1;
		}if (s == 0)cout << 'N'<< 'O' << '\n';
		s = 0;
	}
}

day4 2024.2.16

1.找最小者

错误在于第一次忘了写入compare

/*第一行输入一个数n,1 <= n <= 1000,
下面输入n行数据,每一行有两个数,分别是x y。
输出一组x y,该组数据是所有数据中x最小,
且在x相等的情况下y最小的。 */
#include<iostream>
#include<string.h>
#include<map>
#include<algorithm>
using namespace std;
typedef struct m
{
	int x1;
	int x2;
}m;
bool compare(m l, m r)
{
	return  l.x1 < r.x1 || l.x1 == r.x1 && l.x2 < r.x2;
}
int main()
{
	int n; cin >> n; int i, j; m a[10000] = { 0 };
	for (i = 0; i < n; i++)
	{
		cin >> a[i].x1 >> a[i].x2;
	}
	sort(a, a + n,compare);
	cout << a[0].x1<<' ' << a[0].x2;
}

如果是c语言,那就把排序部分给到一个自己写的函数里

2.打印极值点(太简单)

/*在一个整数数组上,对于下标为 i的整数,如果它大于
所有它相邻的整数, 或者小于所有它相邻的整数,
 则称为该整数为一个极值点,极值点的下标就是 i。
 现在给定整数数组,请你找到所有极值点,并输出这些极值点的下标。*/
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int main()
{
	//先输入
	int n; cin >> n; int i; int a[1000] = { 0 };
	for (i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	//第一个数和最后一个数特殊处理其余都是左右两边和自己比较
	for (i = 0; i < n; i++)
	{
		if (i == 0)
		{
			if (a[0] != a[1])cout << 0 << ' ';
		}
		if (i != 0 && i != n - 1)
		{
			if (a[i] > a[i - 1] && a[i] > a[i + 1] || a[i] < a[i - 1] && a[i] < a[i + 1])
			{
				cout << i<<' ';
			}
		}
		if (i == n - 1) {
			if (a[n - 1] != a[n - 2])cout << n - 1 << ' ';
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值