2023 小米笔试 小米笔试题 0923

笔试时间:2023年9月23日 秋招

第一题

题目

小X在一片大陆上探险,有一天他发现了一个洞穴,洞穴里面有n道门,打开每道门都需要对应的钥匙,编号为的钥匙能用于打开第i道门,而且只有在打开了第i道门之后,才能打开第i+1道门,一开始只能打开第1道门。幸运的是,小X在外面探索的途中,每天都能发现一把能打开这n道门中其中一道门的钥匙,每天找完钥匙后他都会去打开所有能打开的门。现在给出他每天找到的钥匙编号,请问每道门分别在哪一天被打开。

输入描述

第一行包合一个正整数n,表示门的数量。

接下来一行包含n个正整数a1,a2,.,an,其中ai表示第i天他找到的钥匙的编号,能够打开第ai道门,数据保证a1-an为1-n的一个排列。

输出描述

输出一行n个数s1,s2,...,sn , 其中si表示第 i 道门在第si天被打开。

样例输入

5

5 3 1 2 4

样例输出

3 4 4 5 5

说明

到第三天时获得的钥匙为1、3、5,能够打开第1道门,到第四天时为1、2、3、5能继续打开第2和3道门,到第五天时获得了全部钥匙,能打开所有剩下的门。

参考题解

双指针模拟,当能开第 i 扇门的时候继续往后开,当天开的门就记录上是哪一天。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
using namespace std;
using ll = long long;

int main() {
    ll n;
    cin >> n;

    vector<ll> arr(n);
    for (ll i = 0; i < n; i++) {
        cin >> arr[i];
    }

    vector<ll> have(n + 1, 0);
    vector<ll> ans(n + 1);

    ll now = 1;
    for (ll i = 0; i < n; i++) {
        have[arr[i]]++;
        while (now <= n && have[now]) {
            ans[now] = i + 1;
            now++;
        }
    }

    cout << ans[1];
    for (ll i = 2; i <= n; i++) {
        cout << ' ' << ans[i];
    }
    cout << '\n';

    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        long n = scanner.nextLong();
        long[] arr = new long[(int) n];
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextLong();
        }

        long[] have = new long[(int) (n + 1)];
        long[] ans = new long[(int) (n + 1)];
        long now = 1;

        for (int i = 0; i < n; i++) {
            have[(int) arr[i]]++;
            while (now <= n && have[(int) now] != 0) {
                ans[(int) now] = i + 1;
                now++;
            }
        }

        System.out.print(ans[1]);
        for (int i = 2; i <= n; i++) {
            System.out.print(" " + ans[i]);
        }
        System.out.println();
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

n = int(input())
arr = list(map(int, input().split()))
have = [0] * (n + 1)
ans = [0] * (n + 1)
now = 1

for i in range(n):
    have[arr[i]] += 1
    while now <= n and have[now] > 0:
        ans[now] = i + 1
        now += 1

print(ans[1], end='')
for i in range(2, n + 1):
    print(' ' + str(ans[i]), end='')
print()

第二题

题目

有一个长度无限长的自然数序列 A,下标从 0开始。初始时所有数均为0。先进行n次修改,然后进行 m 次查询。每次修改给出三个数l,r,x,将A_l,A_l+1..A_r中的每一个数变成它与x的异或值。每次查询给出一个数字 p表示查询 A_p的值。

输入描述

第一行两个整数n,m,意义如上文所述;

接下来n行3个整数 l,r,x,意义如上文所述;

接下来m行1个整数p,意义如上文所述。

对于所有的数据,1<=n,m<=10^4,l<=r,0<=l, r, p<=10^18,0<=x<=10^9。

输出描述

输出m行每行一个整数,表示答案。

样例输入

2 2

1 5 1

3 7 2

4

6

样例输出

3

2

说明

初始时所有数均为0;

第1次修改A1~A5,x为1,则将A1~A5的值修改为和1的异或值,当前序列的为0、1、1、1、1、1、0、0、......;

第2次修改A3~A7,x为2,则将A3~A7的值修改为和2的异或值,当前序列的为0、1、1、3、3、3、2、2...... 查询A4和A6的值为3和2。

参考题解

起点和x排个序,终点和x排个序,从小到大遍历,然后用三指针,如果起点小于当前查询,那就异或上该操作,如果终点小于当前查询,就再次异或,相当于取消该操作,实际得到的就是当前查询真实的操作,可以借助画线段对比;

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
using namespace std;
using ll = long long;

int main() {
    ll n, m;
    cin >> n >> m;

    vector<array<ll, 3> >

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2023 秋招笔试题汇总解析 文章被收录于专栏

2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。

全部评论
好家伙 第一题是360原题
点赞 回复 分享
发布于 2023-11-01 00:20 广东

相关推荐

神哥不得了:神哥来啦~1.建议不要包装,很容易问穿2.没日常也能找到暑期3.简历模板换一下,字体和版式看着好难受,而且最好压缩到一页,技术的倒数第2和3重复啦,项目建议换两个高质量的上去,如果时间够的话,八股就把高频top50的题目多巩固几遍,吃透,注意不要找假高频,这样绝对能找到暑期
点赞 评论 收藏
分享
评论
1
9
分享

创作者周榜

更多
牛客网
牛客企业服务