天天看点

腾讯2020校招笔试题 逛街 JAVA题解逛街

逛街

小Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。

小Q从第一栋一直走到了最后一栋,小Q从来都没有见到这么多的楼,所以他想知道他在每栋楼的位置处能看到多少栋楼呢?(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住) 

输入描述:

输入第一行将包含一个数字n,代表楼的栋数,接下来的一行将包含n个数字wi(1<=i<=n),代表每一栋楼的高度。

1<=n<=100000;

1<=wi<=100000; 

输出描述:

输出一行,包含空格分割的n个数字vi,分别代表小Q在第i栋楼时能看到的楼的数量。
      

输入例子1:

6
5 3 8 3 2 5
      

输出例子1:

3 3 5 4 4 4
      

例子说明1:

当小Q处于位置3时,他可以向前看到位置2,1处的楼,向后看到位置4,6处的楼,加上第3栋楼,共可看到5栋楼。当小Q处于位置4时,他可以向前看到位置3处的楼,向后看到位置5,6处的楼,加上第4栋楼,共可看到4栋楼。      

思路:经典单调栈问题。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Stack;
public class Main{
	static final int N = 100005;
	static int []arr = new int [N];
	static int []cnt = new int [N];
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		PrintWriter pw = new PrintWriter(System.out);
		int n = Integer.parseInt(reader.readLine());
		String []split = reader.readLine().split(" ");
		for(int i = 1;i <= n;i ++) {
			arr[i] = Integer.parseInt(split[i-1]);
		}
		Stack<Integer> Lstk = new Stack<>();
		for(int i = 1;i <= n;i ++) {
			cnt[i] += Lstk.size();
			while(!Lstk.isEmpty() && arr[i] >= Lstk.peek()) Lstk.pop();
			Lstk.add(arr[i]);
		}
		Stack<Integer> Rstk = new Stack<>();
		for(int i = n;i >= 1;i --) {
			cnt[i] += Rstk.size();
			while(!Rstk.isEmpty() && arr[i] >= Rstk.peek()) Rstk.pop();
			Rstk.add(arr[i]);
		}
		for(int i = 1;i <= n;i ++) {
			if(i == n) pw.println(cnt[i] + 1);
			else pw.print(cnt[i] + 1 + " ");
		}
		pw.flush();
		pw.close();
		reader.close();
	}
}