机试_2_排序与查找

【新2023Q2押题JAVA】华为OD机试 - 查找舆情热词 or 热词排序 标题中出现的词语频率系数为3,正文中出现的词语频率系数为1,返回的答案应该按照词语出现从高到低排序,当词语出现次数频率相同时,在标题中出现频率次数高的排在前面,如果仍然相同,则按照词语在标题中出现的先后顺序进行排序,如果仍相同,则按照词语在正文中出现的先后顺序进行排序,先出现的排在前面。输入正整数topN和文章数M,正整数topN表示要找出来的出现频率最高的topN个字符串,M篇文章中每篇文章会有两个字符串,一个是标题字符串,一个是正文字符串,字符串间有空格,每个单词被空格隔开。 阅读详情

一、排序

排序在机试中分布广泛,既是必须掌握的基本算法,也是学习其他大部分算法的前提和基础。

排序:

  1. 内定义数据类型
  2. 自定义数据类型
    1. 设计比较函数
    2. 定义大小

1 排序–华中科技大学

描述:

对输入的n个数进行排序并输出。

输入描述:

输入的第一行包括一个整数n(1<=n<=100)。 接下来的一行包括n个整数。

输出描述:

可能有多组测试数据,对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格。 每组测试数据的结果占一行。

示例1

输入:

4
1 4 3 2

输出:

1 2 3 4

题解:

这是在机试中曾经出现的关于排序考点的一个真题。面对这样的考题,我们很快就会联想各种排序算法,如快速排序、归并排序等。因为C+内部已为大家编写了基于快速排序的函数sot,只需调用这个函数,便能轻易地完成排序。

sort(first, last, comp)函数有三个参数:
first:待排序序列的起始地址(包含起始地址,即闭区间)
last:待排序序列的结束地址(不包含结束地址,即开区间)
comp:为排序方式,不填写时默认为升序方式。
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int MAX_NUM = 100;

/**
 * 排序--华中科技大学
 * @return
 */
int main() {
    int n;
    cin >> n;
    int num[MAX_NUM];
    for (int i = 0; i < n; ++i) {
        cin >> num[i];
    }
    /**
     * sort(first, last, comp)函数有三个参数:
     * first:待排序序列的起始地址
     * last:待排序序列的结束地址(不包含结束地址,即开区间)
     * comp:为排序方式,不填写时默认为升序方式。
     */
    sort(num, num + n);
    for (int j = 0; j < n; ++j) {
        cout << num[j] << " ";
    }
    cout << endl;
    return 0;
}


2 成绩排序–清华大学

描述:

用一维数组存储学号和成绩,然后,按成绩排序输出。

输入描述:

输入第一行包括一个整数N(1<=N<=100),代表学生的个数。 接下来的N行每行包括两个整数p和q,分别代表每个学生的学号和成绩。

输出描述:

按照学生的成绩从小到大进行排序,并将排序后的学生信息打印出来。 如果学生的成绩相同,则按照学号的大小进行从小到大排序。

示例1

输入:

3
1 90
2 87
3 92

输出:

2 87
1 90
3 92

题解:

本题是对一组基本类型进行排序,因此要先将这一组基本类型构建为一个结构体或者类,然后对结构体或者类进行排序。
排序规则:按成绩升序排序,成绩相同则按学号升序排序。

因此,我们自定义比较函数compare(param x, param y)
遇到新的排序规则时,当比较函数的返回值为true时,则该比较函数的第一个参数会排在第二个参数前面,即x排在y前面。
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int MAX_NUM = 100;

struct Student {
    int number;
    int score;
};


/**
 * 自定义比较规则,升序排序
 * @param x
 * @param y
 * @return
 */
bool compare(Student x, Student y) {
    //成绩相等,则比较学号
    if (x.score == y.score) {
        /*
         * 若x.number < y.number 成立,其结果为true,则x排在y前面
         * 若x.number < y.number 不成立,其结果为false,则x排在y后面
         */
        return x.number < y.number;
    } else {
        //成绩不等,则比较成绩
        return x.score < y.score;
    }
}

/**
 * 成绩排序--清华大学
 * @return
 */
int main() {
    Student studentArr[MAX_NUM];
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> studentArr[i].number >> studentArr[i].score;
    }

    sort(studentArr, studentArr + n, compare);

    for (int j = 0; j < n; ++j) {
        cout << studentArr[j].number << " " << studentArr[j].score << endl;
    }

    return 0;
}


3 整数奇偶排序–北京大学

描述:

输入10个整数,彼此以空格分隔。重新排序以后输出(也按空格分隔),要求: 1.先输出其中的奇数,并按从大到小排列; 2.然后输出其中的偶数,并按从小到大排列。

输入描述:

任意排序的10个整数(0~100),彼此以空格分隔。

输出描述:

可能有多组测试数据,对于每组数据,按照要求排序后输出,由空格分隔。 1. 测试数据可能有很多组,请使用while(cin>>a[0]>>a[1]>>…>>a[9])类似的做法来实现; 2. 输入数据随机,有可能相等。

示例1

输入:

4 7 3 13 11 12 0 47 34 98

输出:

47 13 11 7 3 0 4 12 34 98

题解:

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int NUM = 10;

/**
 * 自定义排序规则
 * 1.偶数在奇数前
 * 2.偶数按大到小排序
 * 3.奇数按小到大排序
 * @return
 */
bool compare(int x, int y) {
    if ((x & 1) == 0 && (y & 1) == 0) {
        //x和y都是偶数,从小到大排序
        return x < y;
    } else if ((x & 1) == 1 && (y & 1) == 1) {
        //x和y都是奇数,从大到小排序
        return x > y;
    } else {
        //偶数排在奇数前
        return (x & 1) > (y & 1);
    }
}

/**
 * 整数奇偶排序
 * @return
 */
int main() {
    int numArr[NUM];

    while (cin >> numArr[0]) {
        for (int i = 1; i < NUM; ++i) {
            cin >> numArr[i];
        }

        sort(numArr, numArr + NUM, compare);

        for (int j = 0; j < NUM; ++j) {
            cout << numArr[j] << " ";
        }
        cout << endl;
    }

    return 0;
}

二、查找

查找也是一类必须掌握的基础算法,不仅会直接考察,也是其他算法的基础。同时,排序和查找也经常绑定在一起考察,排序的重要意义之一就帮助人们更加方便地查找。


1 查找–北京邮电大学

描述:

输入数组长度 n 输入数组 a[1…n] 输入查找个数m 输入查找数字b[1…m] 输出 YES or NO 查找有则YES 否则NO 。

输入描述:

输入有多组数据。 每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m,n<=100)。

输出描述:

如果在n个数组中输出YES否则输出NO。

示例1

输入:

5
1 5 2 4 3
3
2 5 6

输出:

YES
YES
NO

题解:

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int MAX_NUM = 100;

/**
 * 线性查找
 * @param arr
 * @param n
 * @param target
 * @return
 */
int linearSearch(int arr[], int n, int target) {
    for (int i = 0; i < n; ++i) {
        if (arr[i] == target) {
            return i;
        }
    }
    return -1;
}

/**
 * 自定义二分查找
 * @param arr
 * @param n
 * @param target
 * @return
 */
int binarySearch(int arr[], int n, int target) {
    int left = 0;
    int right = n - 1;
    while (left <= right) {
        /*
         * 若mid = (left+right)/2 当left和right接近整形最大值时可能溢出
         * 下面的写法效果相同且不会有溢出问题
         */
        int mid = left + ((right - left) >> 1);
        if (target < arr[mid]) {
            right = mid - 1;
        } else if (target > arr[mid]) {
            left = mid + 1;
        } else {
            return mid;
        }
    }
    return -1;
}

/**
 * 查找--北京邮电大学
 * @return
 */
int main() {
    int numArr[MAX_NUM];
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> numArr[i];
    }
    /*
     * 二分查找之前要先排序,顺序查找则不用
     */
    sort(numArr, numArr + n);

    int m;
    cin >> m;
    int target;
    for (int j = 0; j < m; ++j) {
        cin >> target;
        if (binarySearch(numArr, n, target) != -1) {
            cout << "YES" << endl;
        } else {
            cout << "NO" << endl;
        }
    }

    return 0;
}

此外,我们再来看看C++内置的二分查找函数。

lower_bound(): 返回大于或者等于目标值的第一个位置
upper_bound(): 返回大于目标值的第一个位置

序列 1  2  4  4  5  8  10  22
索引 0  1  2  3  4  5  6   7

以上述序列为例子
1.目标值为4
lower_bound(): 返回索引2的地址
upper_bound(): 返回索引4的地址

2.目标值为7
lower_bound(): 返回索引5的地址
upper_bound(): 返回索引5的地址

3.目标值为30
lower_bound(): 返回索引7的下一单元的地址(越界)
upper_bound(): 返回索引7的下一单元的地址(越界)
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int MAX_NUM = 100;
/**
 * 查找--北京邮电大学
 * @return
 */
int main() {
    int numArr[MAX_NUM];
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> numArr[i];
    }
    /*
     * 二分查找之前要先排序
     */
    sort(numArr, numArr + n);

    int m;
    cin >> m;
    int target;
    for (int j = 0; j < m; ++j) {
        cin >> target;
        /*
         * C++内部自带的二分查找
         * lower_bound返回的是地址,因为减去首地址numArr,即可得到索引
         */
        int position = lower_bound(numArr, numArr + n, target) - numArr;
        if (position != n && numArr[position] == target) {
            cout << "YES" << endl;
        } else {
            cout << "NO" << endl;
        }
    }

    return 0;
}

三、总结

本章学习了C++内置的sort()排序及其应用,同时也学习简单线性查找算法和二分查找算法。

参考教材:《王道计算机复试——机试指南》

华为OD机试 - 检查是否存在满足条件的数字组合 - 回溯、双指针(Python/JS/C/C++ 2025 C卷 100分) 利用排序的性质,只需在下标大于 max(B_index, C_index) 的部分查找是否存在等于 sum 的数字,这样可以保证 A 与 B、C 互不相同,且 A 一定最大。遍历所有不同的两个下标(注意:B 与 C 的位置不要求大小关系,因为公式中 2C 的角色是固定的),计算 sum = B + 2 * C。此时用两个不同下标的 2 来组成 6 = 2 + 2×2,因此输出 “6 2 2”。排序后数组为 [2, 4, 6, 10],组合 10 = 2 + 2×4 满足要求,故输出对应结果。 阅读详情

相关推荐

华为OD机试用 go 实现 -【部门人力分配(200 分)】

目前要求每个月最多有 2 个需求开发,并且每个月需要完成的需求不能超过部门人力。请帮部门评估在满足需求开发进度的情况下,每个月需要的最小人力是多少?输入数据两行,第一行输入数据 3 表示开发时间要求,第二行输入数据表示需求工作量大小,输出数据一行,表示部门人力需求。参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。对于每一组测试数据,输出部门需要人力需求,行末无多余的空格。个月内完成开发,进行人力安排后每个月的人力是固定的。个需求的工作量大小,单位:人月。

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 867

数据结构实验之排序八:快速排序

题目描述 给定N(N≤10^5)个整数,要求用快速排序对数据进行升序排列,注意不得使用STL。 input 8 49 38 65 97 76 13 27 49 output 13 27 38 49 49 65 76 97 代码 #include<iostream> using namespace std; void func(int a[],int l,int r) { int k = a[l],i=l,j=r; if(l>=r) return;

dldl1718的博客 531

【华为OD机试考生抽中题 C&D 卷】部门人力分配(200 分),用 C 编码,速通

华为 OD C 卷和 D 卷新增题难度整体偏低,大家重点依旧建议刷 B 卷。

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 799

定义结构体,通过动态数组和函数,实现对数据的输入、排序、输出

#include <stdio.h> #include <stdlib.h> struct student { int age; char name[20]; float score; }; void Inputstudent(struct student * p,int a); void Outputstudent(struct student * p,int b); void paixu(struct student * p,int c); int.

qq_45769071的博客 785

【华为OD机试】2024年真题C卷(c++)-部门人力分配

【华为OD机试】2024年真题C卷(c++)-部门人力分配:部门在进行需求开发时需要进行人力安排。当前部门需要完成 N 个需求,需求用 requirements[i] 表示,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。这部分需求需要在 M 个月内完成开发,进行人力安排后每个月的人力是固定的。目前要求每个月最多有 2 个需求开发,并且每个月需要完成的需求不能超过部门人力。请帮部门评估在满足需求开发进度的情况下,每个月需要的最小人力是多少?

u014481728的博客 878

华为OD机试 Java【需求开发人力安排】

输入为 M 和 requirements,M 表示需求开发时间要求,requirements 表示每个需求工作量大小,N 为 requirements长度,当前部门需要完成 N 个需求,需求用 requirements 表述,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。目前要求每个月最多有2个需求开发,并且每个月需要完成的需求不能超过部门人力。这部分需求需要在 M 个月内完成开发,进行人力安排后每个月人力时固定的。对于每一组测试数据,输出部门需要人力需求,行末无多余的空格。

AlgorithmHero的博客 119

算法初步之排序

     这一小节的内容都是排序,排序所能涉及到的内容很多。在这些题目中,冒泡,选择排序偶尔会用到。因为涉及到的数据量并不大,因此不会超时。多数情况下,调用sort函数可以解决大部分需要排序的东西。sort内部采用类似快速排序的的机制运作,很少会超时。还有就是在操作字符串的时候,很多细节还是要注意,否则很容易遇到莫名其妙的运行错误。这一节的题目比较简单,接下来是这一节的九道题目。   问题A:...

qq_33356734的博客 752

华为OD机试 C++【需求开发人力安排】

输入为 M 和 requirements,M 表示需求开发时间要求,requirements 表示每个需求工作量大小,N 为 requirements长度,当前部门需要完成 N 个需求,需求用 requirements 表述,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。目前要求每个月最多有2个需求开发,并且每个月需要完成的需求不能超过部门人力。这部分需求需要在 M 个月内完成开发,进行人力安排后每个月人力时固定的。对于每一组测试数据,输出部门需要人力需求,行末无多余的空格。

AlgorithmHero的博客 97

机试2.1—排序

划重点: 1.头文件 #include<algorithm> 2.定义排序规则函数bool cmp(形参){。。。} 3.调用排序函数sort(buf,buf+n,cmp) 题目:成绩排序 输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理。 示例: jack70 peter96 Tom...

Miss_He的博客 243

华为OD机试 Python【人力资源安排】

输入为 M 和 requirements,M 表示需求开发时间要求,requirements 表示每个需求工作量大小,N 为 requirements长度,当前部门需要完成 N 个需求,需求用 requirements 表述,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。目前要求每个月最多有2个需求开发,并且每个月需要完成的需求不能超过部门人力。这部分需求需要在 M 个月内完成开发,进行人力安排后每个月人力时固定的。对于每一组测试数据,输出部门需要人力需求,行末无多余的空格。

AlgorithmHero的博客 109

华为OD机试 C++【人力资源安排】

输入为 M 和 requirements,M 表示需求开发时间要求,requirements 表示每个需求工作量大小,N 为 requirements长度,当前部门需要完成 N 个需求,需求用 requirements 表述,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。目前要求每个月最多有2个需求开发,并且每个月需要完成的需求不能超过部门人力。这部分需求需要在 M 个月内完成开发,进行人力安排后每个月人力时固定的。对于每一组测试数据,输出部门需要人力需求,行末无多余的空格。

wtswts1232的博客 91

【机试总结】排序

题目要点 区间范围大(要考虑时间复杂度) n个各不相同(可考虑数组) 代码实现 #include<iostream> #include<algorithm> #define OFFSET 500000 // 转化为数组表示 using namespace std; int Hash[1000002]; // 保存每个数的输入情况 int main() { int n,m,a; while(cin>>n>>m){ // input f.

C_xixixixi的博客 253

华为OD机试Java - 矩阵扩散

存在一个m*n的二维数组,其成员取值范围为0,1,2。其中值为1的元素具有同化特性,每经过1s,将周围上下左右值为0的元素同化为1,而值为2的元素免疫同化。将数组所有成员随机同化成0或2,再将矩阵的[0,0]元素修改成1,在经过足够长的时间后,求矩阵中有多少个元素是0或2(即0和2的数量之和)。

steven_my的博客 167

机试_2_排序与查找_习题

学习完之后,当然要做相应地练习啦~ 注:上述习题都可以在牛客进行测试。其他题目在“题目列表”中基本都可以找到。 另外,此文章仅仅是提供解题思路,并非最优解。

Window_mouse的博客 785

华为OD机试 Java【人力资源安排】

输入为 M 和 requirements,M 表示需求开发时间要求,requirements 表示每个需求工作量大小,N 为 requirements长度,当前部门需要完成 N 个需求,需求用 requirements 表述,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。目前要求每个月最多有2个需求开发,并且每个月需要完成的需求不能超过部门人力。这部分需求需要在 M 个月内完成开发,进行人力安排后每个月人力时固定的。对于每一组测试数据,输出部门需要人力需求,行末无多余的空格。

wtswts1232的博客 88

手把手教你用Ollama & AnythingLLM搭建AI知识库,无需编程,跟着做就行!

本地运行大模型耗资源,需要选择较小的模型作为基础模型。在终端中运行时可能会出现 CUDA 错误,表示显存不足,导致提供的端口失效。中文支持不够完善。\3. 文中提到的技术软件工具有:Ollama、Chatbox、Open WebUI、向量数据库、嵌入模型、本地模型 Gemma、AnythingLLM。

2401_86435672的博客 1万+

复试机试算法总结#2:排序与查找

1.排序 使用algorithm头文件中的sort函数,本质为快速排序,默认升序排列。想要进行降序排列或根据某个数值类型进行排列,可以使用自定义的结构体+自定义的比较函数 //想对学生成绩进行降序排列 struct Student { int number; int score; }; Student s[MAXN]; bool cmp(Student s1,Student s2)...

学而不思则忘,思而不学则die 216

STM32F407 HAL库定时器触发ADC采集与DMA数据传输(定时器TIM+ADC+DMA)

在STM32F407系列微控制器的开发中,结合定时器、ADC(模数转换器)与DMA(直接存储器访问)控制器,能够显著提升数据采集与传输的效率。本文将指导你如何使用STM32 HAL库,通过定时器触发ADC1的单通道采集,利用DMA传输数据,最终通过串口将电压值打印出来。具体实现中,我们将读取ADC1的通道5(对应引脚PA5),并将转换得到的电压值发送到串口助手上进行显示。

jmlinux的博客 7011

机试指南part2——排序与查找

排序 内定义数据类型 bool cmp(int &a,int &b) { return a>b;//降序 } while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%d",&data[i]); } sort(data,data+n,cmp); for(int i=0;i<n;i

qq_42254342的博客 166

DOORS需求管理实战:从汽车设计案例看模块化需求拆分技巧

本文通过一个汽车设计实战案例,深入解析了如何利用DOORS进行模块化需求拆分与管理。从捕获原始用户需求到精炼为可追踪的系统需求,再到按子系统(如自动驾驶)进行模块化拆分,文章详细展示了构建需求骨架、建立可追溯性以及实施变更控制的完整流程,帮助团队在复杂系统工程中实现从混沌到秩序的高效协同。

ww90123的博客 244

2011-2024年间各省数字普惠金融指数数据(覆盖广度、使用深度和数字化程度)

2、指标:数字金融普惠指数、数字金融覆盖广度指数、数字金融使用深度指数、普惠金融数字化程度指数、数字金融使用深度指数下属的支付、保险、货币基金、信用服务、投资、信贷等分类指数。中国各省的数字普惠金融指数数据,从数字金融覆盖广度、数字金融使用深度和普惠金融数字化程度3个维度来构建数字普惠金融指标体系。数字普惠金融指数一共3个维度、33项具体指标。全套指数包含数字金融覆盖广度指数、数字金融使用深度指数和普惠金融数字化程度指数,以及数字金融使用深度指数下属的支付、保险、货币基金、信用服务、投资、信贷等分类指数。

【优快云】 1万+
上一篇: 机试_1_暴力求解_习题
下一篇: 机试_2_排序与查找_习题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

窝在角落里学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值