2023大厂笔试模拟练习网站(含题解)
www.codefun2000.com
最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200+道互联网大厂模拟练习题,还在极速更新中。欢迎关注公众号“塔子哥学算法”获取最新消息。
提交链接:
首页 - CodeFun2000
为了更好的阅读体检,可以查看OJ上的题解。进入提交链接,点击右边菜单栏的"查看塔子哥的题解"
题目描述
贫如洗的椎夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0-N的箱子,每个箱子上面有一个数字,箱了排列成一个环,编号最大的箱子的下一个是编号为0的箱子。
请输出每个箱子贴的数字之后的第一个比它大的数,如果不存在则输出-1。
输入描述
输入一个数字字串,数字之间使用逗号分隔,例如: 1,2,3,1
-
1 字串中数字个数10000:
-
-100000 每个数字值10000:
输出描述
下一个大的数列表,以逗号分隔,例如: 2,3,6,-1,6
样例
输入
2,5,2
输出
5,-1,5
说明
第一个2的下一个更大的数是5;
数字5找不到下一个更大的数;
第二个2的下一个最大的数需要循环搜索,结果也是5
输入
3,4,5,6,3
输出
4,5,6,-1,4
说明
无
Java算法源码
import java.util.Arrays; import java.util.LinkedList; import java.util.Scanner; import java.util.StringJoiner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] arr = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray(); System.out.println(getResult(arr)); } public static String getResult(int[] arr) { LinkedList<int[]> stack = new LinkedList<>(); int[] res = new int[arr.length]; Arrays.fill(res, -1); findNextBig(arr, stack, res); if (stack.size() != 1) findNextBig(arr, stack, res); StringJoiner sj = new StringJoiner(","); for (int v : res) { sj.add(v + ""); } return sj.toString(); } public static void findNextBig(int[] arr, LinkedList<int[]> stack, int[] res) { for (int i = 0; i < arr.length; i++) { int ele = arr[i]; while (true) { if (stack.size() == 0) { stack.add(new int[] {ele, i}); break; } else { int[] peek = stack.get(stack.size() - 1); int peekEle = peek[0]; int peekIdx = peek[1]; if (ele > peekEle) { res[peekIdx] = ele; stack.removeLast(); } else { stack.add(new int[] {ele, i}); break; } } } } } }
JS算法源码
/* JavaScript Node ACM模式 控制台输入获取 */ const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.on("line", (line) => { const arr = line.split(",").map(Number); console.log(getResult(arr)); }); function getResult(arr) { const stack = []; const res = new Array(arr.length).fill(-1); findNextBig(arr, stack, res); if (stack.length != 1) findNextBig(arr, stack, res); return res.join(","); } function findNextBig(arr, stack, res) { for (let i = 0; i < arr.length; i++) { const ele = arr[i]; while (true) { if (stack.length == 0) { stack.push([ele, i]); break; } else { const [peekEle, peekIdx] = stack.at(-1); if (ele > peekEle) { res[peekIdx] = ele; stack.pop(); } else { stack.push([ele, i]); break; } } } } }
Python算法源码
# 输入获取 arr = list(map(int, input().split(","))) def findNextBig(arr, stack, res): for i in range(len(arr)): ele = arr[i] while True: if len(stack) == 0: stack.append([ele, i]) break else: peekEle, peekIdx = stack[-1] if ele > peekEle: res[peekIdx] = ele stack.pop() else: stack.append([ele, i]) break # 算法入口 def getResult(): stack = [] res = [-1] * len(arr) findNextBig(arr, stack, res) if len(stack) != 1: findNextBig(arr, stack, res) return ",".join(map(str, res)) # 算法调用 print(getResult())