丢失报文位置 - 华为机试真题题解

华为机试真题

题目描述

某通信系统持续向外发送报文,使用数组 nums 保存 n 个最近发送的报文,用于在报文未达到对端的情况下重发。报文使用序号 sn 表示,序号 sn 按报文发送顺序从小到大排序,相邻报文 sn 不完全连续且可能相同。报文使用循环覆盖的方式保存,即 nums 数组填满后,从头开始保存新的报文。假设需要重发序号为 sn 的报文。请找出序号为 sn 的报文在数组中的起始位置和结束位置。

输入

第一行输入:数组 nums 的大小 n,取值范围为 [0, 10000]。
第二行输入:数组中的所有报文序号 snsn 取值范围为 [0, 100000]。
第三行输入:需要重发的报文序号 sn,取值范围为 [0, 100000]。

输出

输出两个整数 startend,表示需要重发的报文序号 sn 在数组中的起始和结束下标。

示例1

输入:
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。

示例2

输入:
7
0 0 1 2 2 5 6
2

输出:
3 4

解释:
nums 数组大小为 7,保存了 7 个报文,sn 分别是 0 0 1 2 2 5 6,sn 为 2 的报文在数组中有 2 个,下标分别是 3 和 4,因此输出 3 4。

示例3

输入:
7
4 4 7 8 2 3 4
4

输出:
6 1

解释:
nums 数组大小为 7,保存了 7 个报文,sn 分别是 4 4 7 8 2 3 4,sn 为 4 的报文在数组中有 3 个,下标分别是 0、1 和 6。说明 nums 数组存在记录满了从头开始记录的情况,因此输出 6 1。

C++

[代码仅供学习参考并未进行大量数据测试]

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n;
    cin >> n;
    vector<int> nums(n);

    // 最小报文sn的索引位置
    int min_sn_idx = 0;
    for (int i = 0; i < n; i++) {
        cin >> nums[i];
        if (nums[i] < nums[min_sn_idx]) min_sn_idx = i;
    }

    int sn;
    cin >> sn;
    // sn的报文在数组中的起始位置和结束位置
    int start = -1, end = -1;
    for (int i = 0; i < n; i++) {
        // 因为题意说 “序号 `sn` 按报文发送顺序从小到大排序”,因此从最小报文开始遍历数组,并同时更新 start 和 end
        int idx = (i + min_sn_idx) % n;
        if (nums[idx] == sn) {
            if (start == -1) start = idx;
            end = idx;
        }
    }

    cout << start << " " << end << endl;

    return 0;
}

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

#面经##春招##C++##笔试##算法#
C++笔试真题题解 文章被收录于专栏

笔试真题题解

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务