笔试时间:2023年9月20日 秋招  第一题  题目:丢失报文的位置  某通信系统持续向外发送报文,使用数组nums保存n个最近发送的报文,用于在报文未达到对端的情况下重发。报文使用序号sn表示,序号sn按照报文发送顺序从小到大排序,相邻报文sn不完全连续且有可能相同。报文使用循环覆盖的方式保存,即nums数组填满后,从头开始保存新的报文。假设需要重发序号为sn的报文。请找出序号为sn的报文在数组中的开始位置和结束位置。  解答要求:时间限制:C/C++1000ms,其他语言: 2000ms内存限制: C/C++256MB其他语言:512MB  输入描述  第一行输入:数组nums的大小n,取值范围[0,10000]  第二行输入:数组中的所有报文的序号sn,sn取值范围[0,100000]。  第三行输入:需要重发的报文序号sn,取值范围[0,100000]  输出描述  start end  说明:start和end代表需要重发的报文序号sn在数组中的起始下标和结束下标  样例输入     7   0 0 1 2 2 5 6   1    样例输出     2 2    解释  nums数组大小为7。保存了7个报文,sn分别是0 0 1 2 2 5 6  sn为1的报文在数组中仅有1个,下标是2,因此输出2 2  参考题解  模拟。找到最小值,实际上是从从小开始,从最小值开始的第一个是起点,然后是终点。  C++:[此代码未进行大量数据的测试,仅供参考]  #include <iostream>#include <vector>using namespace std;int main() {    int n, search_number;    cin >> n;        vector<int> numbers(n, -1);    for (int i = 0; i < n; i++)         cin >> numbers[i];        cin >> search_number;        int min_index = 0;    int max_value = numbers[0];        for (int i = 0; i < n; i++) {        if (numbers[i] < max_value) {            max_value = numbers[i];            min_index = i;        }    }    int start_index = -1;    int end_index = -1;        for (int i = 0; i < n; i++) {        int current_index = (min_index + i) % n;        if (numbers[current_index] == search_number) {            if (start_index == -1) {                start_index = current_index;                end_index = current_index;            }            else {                end_index = current_index;            }        }    }        cout << start_index << " " << end_index << endl;}  Java:[此代码未进行大量数据的测试,仅供参考]  import java.util.Scanner;import java.util.ArrayList;public class Main {    public static void main(String[] args) {        Scanner input = new Scanner(System.in);        int n = input.nextInt();        ArrayList<Integer> numbers = new ArrayList<>(n);        for (int i = 0; i < n; i++) {            numbers.add(input.nextInt());        }        int searchNumber = input.nextInt();        int minIndex = 0;        int maxValue = numbers.get(0);        for (int i = 0; i < n; i++) {            if (numbers.get(i) < maxValue) {                maxValue = numbers.get(i);                minIndex = i;            }        }        int startIndex = -1;        int endIndex = -1;        for (int i = 0; i < n; i++) {            int currentIndex = (minIndex + i) % n;            if (numbers.get(currentIndex) == searchNumber) {                if (startIndex == -1) {                    startIndex = currentIndex;                    endIndex = currentIndex;                } else {                    endIndex = currentIndex;                }            }        }        System.out.println(startIndex + " " + endIndex);    }}  Python:[此代码未进行大量数据的测试,仅供参考]  n = int(input())numbers = list(map(int, input().split()))search_number = int(input())min_index = 0max_value = numbers[0]for i in range(n):    if numbers[i] < max_value:        max_value = numbers[i]        min_index = istart_index = -1end_index = -1for i in range(n):    current_index = (min_index + i) % n    if numbers[current_index] == search_number:        if start_index == -1:            start_index = current_index            end_index = current_index        else:            end_index = current_indexprint(start_index, end_index)  第二题  题目:快速传球  班级组织传球活动,男女同学随机排成m行n列队伍,第一列中的任意一个男同学都可以作为传球的起点,要求最终将球传到最后一列的任意一个男同学手里,求所有能够完成任务的传球路线中的最优路线(传球次数最少的路线)的传球次数。传球规则:1、男同学只能将球传给男同学,不能传给女同学。2、球只能传给身边前后左右相邻的同学。3、如果游戏不能完成,返回-1。  说明:1、传球次数最少的路线为最优路线。2、最优路线可能不唯一,不同最优路线都为最少传球次数。  解答要求:时间限制:C/C++100ms其他语言: 200ms内存限制: C/C++256MB,其他语言: 512MB。  输入描述  班级同学随机排成的m行n列队伍,1代表男同学,0代表女同学;  输入第一行包含两个用空格分开的整数m[1,30]和n [1,30],表示m行n列的队伍;  接下来是m行每行包含n个用空格分开的整数1或0。  输出描述  最优路线的传球次数(最少传球次数)。  样例输入     4 4   1 1 1 0   1 1 1 0   0 0 1 0   0 1 1 1    样例输出     5    参考题解  最短路BFS。  C++:[此代码未进行大量数据的测试,仅供参考]  #include <iostream>#include <vector>#include <queue>#include <climits>using namespace std;class ShortestPathFinder {public:    int numRows, numCols;    vector<vector<int>> grid;    void solve() {        ios_base::sync_with_stdio(false);        cin.tie(NULL);        cout.tie(NULL);        cin >> numRows >> numCols;        grid.resize(numRows, vector<int>(numCols));        for (int i = 0; i < numRows; i++) {            for (int j = 0; j < numCols; j++) {                cin >> grid[i][j];            }        }        vector<vector<int>> directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};        int result = INT_MAX;        for (int i = 0; i < numRows; i++) {            if (grid[i][0] == 1) {                queue<vector<int>> q;                q.push({0, i, 0});                vector<vector<bool>> used(numRows, vector<bool>(numCols, false));                used[i][0] = true;                while (!q.empty()) {                    vector<int> current = q.front();                    q.pop();                    int distance = current[0];                    int x = current[1];                    int y = current[2];                    if (y == numCols - 1) {                        result = min(result, distance);                    }                    for (vector<int> dir : directions) {                        int nx = x + dir[0];                        int ny = y + dir[1];                        if (isValid(nx, ny) && !used[nx][ny] && grid[nx][ny] == 1) {                            used[nx][ny] = true;                            q.push({distance + 1, nx, ny});                        }                    }                }            }        }
点赞 4
评论 1
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务