1、题目描述
一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了抢到集团的藏宝地,藏宝地有编号从0-N的箱子,每个箱子上面有一个数字,箱子排列成一个环,编号最大的箱子的下一个是编号为0的箱子。
请输出每个箱子贴的数字之后的第一个比它大的数,如果不存在则输出-1。
2、输入描述
输入一个数字子串,数字之间使用逗号分隔,例如:1,2,3,1
1 <= 子串中数字个数 <= 10000;
-100000 <= 每个数字值 <= 100000;
3、输出描述
下一个大的数列表,以逗号分隔,例如:2,3,6,-1,6。
用例:
输入
2,5,2
输出
5,-1,5
ps:
第一个2的下一个更大的数是5;
数字5找不到下一个更大的数;
第二个2的下一个最大的数需要循环搜索,结果也是 5
温馨提示!!!
华为OD机试考试官方会对考生代码查重。华为od机试因为有题库所以有很大的概率抽到原题。如果碰到了题库中的原题,千万不要直接使用题解中的代码,一定要做些修改,比如代码中的变量名,除此之外,代码的组织结构和逻辑也要进行一些改变,所以在日常的刷题中,要提前编写好属于自己的代码。
4、题解
循环数组可以理解为,将数组的前n-1个数拷贝后追加到原数组后面,然后遍历数组求解即可。
代码如下:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] nums = Arrays.stream(sc.nextLine().split(","))
.mapToInt(Integer::parseInt).toArray();
int len = nums.length;
Deque<Integer> stack = new LinkedList<>();
int[] rets = new int[len];
Arrays.fill(rets, -1);
for (int i=0; i<2*len - 1; i++) {
while (!stack.isEmpty() && nums[stack.peek()] < nums[i%len]) {
rets[stack.pop()] = nums[i%len];
}
stack.push(i%len);
}
StringBuilder builder = new StringBuilder();
for(int i = 0;i<rets.length;i++){
builder.append(rets[i]).append(",");
}
System.out.println(builder.substring(0,builder.length()-1));
}
执行结果如下: