找出前边比自己高的人的身高--字节笔试题
题目描述
存在一个多组的输入,第一行输入是有N个同学,接下来的一行分别是N个同学的身高。某同学X前的第一个比他高的同学,记录下其身高值。返回是一行每个同学对应找到的其前边的第一个比自己高的身高值。
示例
例如1:
输入:
5
1 2 3 4 5
输出: -1 -1 -1 -1 -1
例如2:
输入:
5
5 4 3 2 1
输出:
-1 5 4 3 2
Java代码
package ncompanydemos.p2_bytedance;
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;
/**
* @author jiyongjia
* @create 2020/7/11 - 20:28
* @descp: 本地idea中是ctrl+d来停止scanner的输入无法停止的问题
*/
public class Exam03{
//输入输出问题
public static void main(String[] args){
Scanner in = new Scanner(System.in);
ArrayList<Deque<Integer>> lis = new ArrayList<>();
while(in.hasNext()){
int n = in.nextInt();
int[] arr = new int[n];
for(int i=0;i<n;i++){
arr[i] = in.nextInt();
}
//调用方法
Deque<Integer> stack = solve(n,arr);
lis.add(stack);
}
//遍历出结果集
for(Deque<Integer> d : lis){
while(!d.isEmpty()){
System.out.print(d.pop()+" ");
}
System.out.println();
}
}
//处理算法
public static Deque<Integer> solve(int n,int[] arr){
Deque<Integer> stack = new LinkedList<Integer>();
if(n==1) {
stack.push(-1);
return stack;
}
for(int i=arr.length-1;i>=1;i--){
boolean flag = false;
for(int j=i-1;j>=0;j--){
if(arr[j]>arr[i]){
stack.push(arr[j]);
flag = true;//代表存入了值
break;
}
}
//如果内层for一直没有比当前大的值,就存-1进去
if(!flag){
stack.push(-1);
}
}
//最外层循环是处理到i=1结束的,最前边的那个值始终放-1;
stack.push(-1);
return stack;
}
}
输出
在线编程时候还是没通过,只通过自测用例,估计程序时间复杂度问题吧!要么就是磨人的输入输出有问题