恭喜发现宝藏!搜索公众号【TechGuide】回复公司名,解锁更多新鲜好文和互联网大厂的笔经面经。
作者@TechGuide【全网同名】
订阅专栏: 【专享版】2024最新大厂笔试真题解析,错过必后悔的宝藏资源!
第一题:函数排列
题目描述
你有一个长度为m的正整数序列,下标从1开始。对于这个序列,你需要统计整个序列的数字种类数,记种类数为m,之后对于每一种数字x,记其出现次数为Cx,设函数f(x)表示在序列中从左到右第[Cx/2]个数字x对应的下标([y]表示对y向上取整,例如[0.5]=1,[2]=2)。最后你需要将所有f(x)按从小到大的顺序输出出来。
输入描述
第一行一个正整数n,表示序列长度
第二行n个由空格隔开的正整数a1,a2,…an,表示该序列
1 ≤n ≤ 100000
1 ≤ ai < 10000
输出描述
第一行输出一个正整数m,表示序列中的数字种类数
第二行输出m个由空格隔开的正整数,分别表示从小到大的顺序排序之后的函数值,未尾不要输出多余空格。
样例
输入
9
3 4 5 5 3 4 4 5 3
输出
3
4 5 6
样例说明
一共有3,4,5三种数字,其中f(3)=5,f(4)=6,f(5)=4 ,排序后就是4,5,6
思路
遍历序列,统计数字出现次数和位置,计算函数值再输出即可。
代码
Java版本
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = scanner.nextInt();}int[] res = calculateRes(arr);System.out.println(res.length);for (int val : res) {System.out.print(val + " ");}}private static int[] calculateRes(int[] arr) {Map<Integer, Integer> counter = new HashMap<>();Map<Integer, List<Integer>> positions = new HashMap<>();int position = 1;for (int x : arr) {counter.put(x, counter.getOrDefault(x, 0) + 1);if (counter.get(x) == 1) {positions.put(x, new ArrayList<>(Collections.singletonList(position)));} else {positions.get(x).add(position);}position++;}int[] result = new int[counter.size()];int count = 0;for (int x : counter.keySet()) {int p = (counter.get(x) - 1) / 2 + 1;result[count] = positions.get(x).get(p - 1);count++;}Arrays.sort(result);return result;}
}
// vx公众号关注TechGuide,专业生产offer收割机。
CPP版本
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>using namespace std;vector<int> calculateRes(const vector<int>& arr) {map<int, int> counter;map<int, vector<int>> positions;int position = 1;for (int x : arr) {counter[x] = counter[x] + 1;if (counter[x] == 1) {positions[x] = {position};} else {positions[x].push_back(position);}position++;}vector<int> result(counter.size());int count = 0;for (auto& pair : counter) {int p = (pair.second - 1) / 2 + 1;result[count] = positions[pair.first][p - 1];count++;}sort(result.begin(), result.end());return result;
}int main() {int n;cin >> n;vector<int> arr(n);for (int i = 0; i < n; i++) {cin >> arr[i];}vector<int> res = calculateRes(arr);cout << res.size() << endl;for (int val : res) {cout << val << " ";}return 0;
}
// vx公众号关注TechGuide,专业生产offer收割机。
第二题:双人游戏
题目描述
你和你的朋友最近喜欢上了一款电子游戏,这个游戏需要两个人一起玩,每个玩家控制一个角色。我们将这两个角色分别命名为P1和P2。
游戏在一个无限大的方格地图上玩,每个玩家可以通过操作键盘上的WASD键来控制自己的角色。详细的说,按W键可以往上走一格;按A键可以往左移动一格;按S键可以往下移动一格;按D键可以往右移动一格。
游戏一开始,P1降临在这个位置(x1, y1),P2降临在(x2, y2),之后他们同时操作了n次。一旦P1与P2在某时刻同时出现在某一个整数格点(即横纵坐标都为整数)上,那么游戏就结束。
现在,给出他们的某一局游戏的操作记录,游戏系统需要判断是否在其中某个时刻就已经结束了,并输出最早能够判断这局游戏结束的时刻。
输入描述
第一行一个正整数n
第二行四个整数x1, y1, x2, y2
第三行一个长度为n且仅包含WASD四种字母的字符串,表示P1的操作记录
第四行一个长度为n且仅包含WASD四种字母的字符串,表示P2的操作记录
(x1, y1)为P1的初始位置,(x2, y2)为P2的初始位置
初始P1和P2位置互不相同
输出描述
如果不能判断出游戏是否结束,输出"Not Over";否则输出一行一个整数,表示最早的能判断游戏是否结束的操作次数。
样例
输入
4
1 1 4 4
DWDD
ASSS
输出
3
样例说明
P1的初始位置为(1,1),P2的初始位置是(4,4),两人最终会在(3,2)相遇
思路
模拟两人运动轨迹。
代码
Java版本
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int x1 = scanner.nextInt();int y1 = scanner.nextInt();int x2 = scanner.nextInt();int y2 = scanner.nextInt();String str1 = scanner.next();String str2 = scanner.next();boolean ok = false;for (int i = 0; i < n; i++) {int[] result1 = move(x1, y1, str1.charAt(i));int[] result2 = move(x2, y2, str2.charAt(i));x1 = result1[0];y1 = result1[1];x2 = result2[0];y2 = result2[1];if (x1 == x2 && y1 == y2) {ok = true;System.out.println(i + 1);break;}}if (!ok) {System.out.println("Not Over");}}private static int[] move(int x, int y, char ch) {if (ch == 'W') {x += 1;}if (ch == 'A') {y -= 1;}if (ch == 'S') {x -= 1;}if (ch == 'D') {y += 1;}return new int[]{x, y};}
}
// vx公众号关注TechGuide,专业生产offer收割机。
CPP版本
#include <iostream>using namespace std;int main() {int n;cin >> n;int x1, y1, x2, y2;cin >> x1 >> y1 >> x2 >> y2;string str1, str2;cin >> str1 >> str2;bool ok = false;for (int i = 0; i < n; i++) {int result1[2] = {0};int result2[2] = {0};if (str1[i] == 'W') {result1[0] = x1 + 1;} else if (str1[i] == 'A') {result1[1] = y1 - 1;} else if (str1[i] == 'S') {result1[0] = x1 - 1;} else if (str1[i] == 'D') {result1[1] = y1 + 1;}if (str2[i] == 'W') {result2[0] = x2 + 1;} else if (str2[i] == 'A') {result2[1] = y2 - 1;} else if (str2[i] == 'S') {result2[0] = x2 - 1;} else if (str2[i] == 'D') {result2[1] = y2 + 1;}x1 = result1[0];y1 = result1[1];x2 = result2[0];y2 = result2[1];if (x1 == x2 && y1 == y2) {ok = true;cout << i + 1 << endl;break;}}if (!ok) {cout << "Not Over" << endl;}return 0;
}
// vx公众号关注TechGuide,专业生产offer收割机。