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秋招各大笔试题汇总,c++,java,python多种语言分析,解答。