[编程题] 找出前边比自己高的人的身高--字节笔试题

找出前边比自己高的人的身高--字节笔试题

题目描述

存在一个多组的输入,第一行输入是有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;
    }
}

输出

image-20200711205247204

在线编程时候还是没通过,只通过自测用例,估计程序时间复杂度问题吧!要么就是磨人的输入输出有问题

原文地址:https://www.cnblogs.com/jiyongjia/p/13285439.html