2023大厂笔试模拟练习网站(含题解)
www.codefun2000.com
最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200+道互联网大厂模拟练习题,还在极速更新中。欢迎关注公众号“塔子哥学算法”获取最新消息。
提交链接:
首页 - CodeFun2000
为了更好的阅读体检,可以查看OJ上的题解。进入提交链接,点击右边菜单栏的"查看塔子哥的题解"
题目内容
AI识别到面板上有N () 个指示灯,灯大小一样,任意两个之间无重叠。
由于AI识别误差,每次识别到的指示灯位置可能有差异,以4个坐标值描述AI识别的指示灯的大小和位置(左上角x1,y1,右下角x2,y2),
请输出先行后列排序的指示灯的编号,排序规则:
1.每次在尚未排序的灯中挑选最高的灯作为的基准灯,
2.找出和基准灯属于同一行所有的灯进行排序。两个灯高低偏差不超过灯半径算同一行(即两个灯坐标的差\leq灯高度的一半)。
输入描述
第一行为N,表示灯的个数 接下来N行,每行为1个灯的坐标信息,格式为:
编号x1 y1 2 y2
-
编号全局唯一
-
1编号100
-
0x1<x2 1000
-
0y1 y2 1000
输出描述
排序后的编号列表,编号之间以空格分隔
样例
输入
5 1 0 0 2 2 2 6 1 8 3 3 3 2 5 4 5 5 4 7 6 4 0 4 2 6
输出
12345
说明
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | x轴 |
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | ||||||||
1 | 1 | 1 | 2 | 2 | ||||||
2 | 3 | 3 | 2 | 2 | ||||||
3 | 3 | 3 | ||||||||
4 | 4 | 4 | 5 | 5 | ||||||
5 | 4 | 4 | 5 | 5 | ||||||
6 | ||||||||||
7 | ||||||||||
8 | ||||||||||
y轴 |
Java算法源码
import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; import java.util.StringJoiner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); Light[] lights = new Light[n]; for (int i = 0; i < n; i++) { int id = sc.nextInt(); int x1 = sc.nextInt(); int y1 = sc.nextInt(); int x2 = sc.nextInt(); int y2 = sc.nextInt(); lights[i] = new Light(id, (x1 + x2) / 2, (y1 + y2) / 2, (x2 - x1) / 2); } System.out.println(getResult(lights)); } public static String getResult(Light[] lights) { // 按照圆心y坐标升序 Arrays.sort(lights, (a, b) -> a.y - b.y); // ans记录题解 StringJoiner ans = new StringJoiner(" "); // sameRowLights记录同一行的灯 ArrayList<Light> sameRowLights = new ArrayList<>(); Light base = lights[0]; sameRowLights.add(base); for (int i = 1; i < lights.length; i++) { Light light = lights[i]; // 如果lights[i]的纵坐标和base的纵坐标相差不超过半径,则视为同一行 if (light.y - base.y <= base.r) { sameRowLights.add(light); } else { // 否则,不是同一行 // 针对同一行的灯,再按照横坐标升序 sameRowLights.sort((a, b) -> a.x - b.x); sameRowLights.forEach(a -> ans.add(a.id + "")); sameRowLights.clear(); // 开始新的一行记录 base = light; sameRowLights.add(base); } } // 注意不要漏了最后一行 if (sameRowLights.size() > 0) { sameRowLights.sort((a, b) -> a.x - b.x); sameRowLights.forEach(a -> ans.add(a.id + "")); } return ans.toString(); } } class Light { int id; // 编号 int x; // 圆心横坐标 int y; // 圆心纵坐标 int r; // 圆半径 public Light(int id, int x, int y, int r) { this.id = id; this.x = x; this.y = y; this.r = r; } }
JS算法源码
/* JavaScript Node ACM模式 控制台输入获取 */ const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines = []; let n; rl.on("line", (line) => { lines.push(line); if (lines.length === 1) { n = lines[0] - 0; } if (n && lines.length == n + 1) { lines.shift(); const lights = lines.map((line) => { const [id, x1, y1, x2, y2] = line.split(" ").map(Number); return new Light(id, (x1 + x2) >> 1, (y1 + y2) >> 1, (x2 - x1) >> 1); }); console.log(getResult(lights)); lines.length = 0; } }); class Light { constructor(id, x, y, r) { this.id = id; // 编号 this.x = x; // 圆心横坐标 this.y = y; // 圆心纵坐标 this.r = r; // 圆半径 } } function getResult(lights) { // 按照圆心y坐标升序 lights.sort((a, b) => a.y - b.y); // ans记录题解 const ans = []; // sameRowLights记录同一行的灯 const sameRowLights = []; let base = lights[0]; sameRowLights.push(base); for (let i = 1; i < lights.length; i++) { const light = lights[i]; // 如果lights[i]的纵坐标和base的纵坐标相差不超过半径,则视为同一行 if (light.y - base.y <= base.r) { sameRowLights.push(light); } else { // 否则,不是同一行 // 针对同一行的灯,再按照横坐标升序 sameRowLights.sort((a, b) => a.x - b.x).forEach((a) => ans.push(a.id)); sameRowLights.length = 0; // 开始新的一行记录 base = light; sameRowLights.push(base); } } // 注意不要漏了最后一行 if (sameRowLights.length > 0) { sameRowLights.sort((a, b) => a.x - b.x).forEach((a) => ans.push(a.id)); sameRowLights.length = 0; } return ans.join(" "); }
Python算法源码
class Light: def __init__(self, id, x, y, r): self.id = id # 编号 self.x = x # 圆心横坐标 self.y = y # 圆心纵坐标 self.r = r # 圆半径 # 输入获取 n = int(input()) arr = [list(map(int, input().split())) for _ in range(n)] lights = list(map(lambda ele: Light(ele[0], (ele[1] + ele[3]) // 2, (ele[2] + ele[4]) // 2, (ele[3] - ele[1]) // 2), arr)) # 算法入口 def getResult(): # 按照圆心y坐标升序 lights.sort(key=lambda l: l.y) # ans记录题解 ans = [] # sameRowLights记录同一行的灯 sameRowLights = [] base = lights[0] sameRowLights.append(base) for i in range(1, len(lights)): light = lights[i] # 如果lights[i]的纵坐标和base的纵坐标相差不超过半径,则视为同一行 if light.y - base.y <= base.r: sameRowLights.append(light) else: # 否则,不是同一行 # 针对同一行的灯,再按照横坐标升序 sameRowLights.sort(key=lambda l: l.x) for l in sameRowLights: ans.append(l.id) sameRowLights.clear() # 开始新的一行记录 base = light sameRowLights.append(base) # 注意不要漏了最后一行 if len(sameRowLights) > 0: sameRowLights.sort(key=lambda l: l.x) for l in sameRowLights: ans.append(l.id) return " ".join(map(str, ans)) # 算法调用 print(getResult())