腾讯2020校园招聘-后台 第二题
题目:
小Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。
小Q从第一栋一直走到了最后一栋,小Q从来都没有见到这么多的楼,
所以他想知道他在每栋楼的位置处能看到多少栋楼呢?(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住)
输入例子1:
[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栋楼。
代码:
//暴力法超时,未通过
1 /** 2 * @author zcy 3 * @date 2021年04月08日 12:46 4 */ 5 public class Solution { 6 7 public int[] findBuilding (int[] heights) { 8 // write code here 9 int left=0, right=0; 10 int count=0; 11 int[] res=new int[heights.length]; 12 for (int i = 0; i < heights.length; i++) { 13 //i为当前统计位置,count为统计值,再最后要加上自己(能看到自己) 14 left=i-1; 15 right=i+1; 16 count=0; 17 //统计前方(左侧)可看 18 int hight=0; //遍历后方时,得到的当前最高的房屋高度,比此低和同高,看不到 19 while(left>=0){ 20 if(hight<heights[left]){ 21 count++; 22 hight=heights[left]; 23 } 24 left--; 25 } 26 hight=0; 27 28 //统计后方(右侧)可看 29 while(right<heights.length){ 30 if(hight<heights[right]){ 31 count++; 32 hight=heights[right]; 33 } 34 right++; 35 } 36 res[i]=++count; 37 } 38 return res; 39 } 40 }
代码:
1 package com.zcy.mybatisplus.tx;/** 2 * @author chenyang zhang 3 * @date 2021/4/8 - 12:46 4 */ 5 6 import java.util.Arrays; 7 import java.util.Stack; 8 9 /** 10 * @author zcy 11 * @date 2021年04月08日 12:46 12 */ 13 //采用单调递减栈,栈顶元素最小,因为前面房屋矮,不会挡住后面; 14 // 前面高,才会挡住后面,栈顶是最接近当前位置房屋,所以要最小, 15 // 代表此时栈顶所在位置向某一方向能看到房屋。 16 public class Solution { 17 18 public int[] findBuilding (int[] heights) { 19 // write code here 20 Stack<Integer> stack=new Stack<>(); 21 int len=heights.length; 22 int[] res=new int[len]; 23 //至少可以看到自己 24 Arrays.fill(res,1); 25 //从后往前看,如果当前位置比栈顶小,那么可以看到 26 for (int i = len-1; i >=0 ; i--) { 27 res[i]+=stack.size(); 28 //此时是为了保证单调递减,求的下一位置可看到的房屋数量 29 while(!stack.isEmpty()&&stack.peek()<=heights[i]){ 30 stack.pop(); 31 } 32 stack.push(heights[i]); 33 } 34 //将栈恢复到空栈,计算下一个方向 35 stack.clear(); 36 37 //从前往后看,如果当前位置比栈顶小,那么站在其后面一个位置可以看到当前房屋 38 //反之当前房屋比栈顶高,站在后面一个位置就看不到此时的栈顶这个房屋,所以要退栈 39 for (int i = 0; i <=len-1 ; i++) { 40 res[i]+=stack.size(); //记录当前房屋朝后看额能看到的数量 41 while(!stack.isEmpty()&&stack.peek()<=heights[i]){ 42 stack.pop(); 43 } 44 stack.push(heights[i]); 45 } 46 return res; 47 } 48 49 public static void main(String[] args) { 50 int[] arr= {5, 3, 8, 3, 2, 5}; 51 Solution solution=new Solution(); 52 int[] res=solution.findBuilding(arr); 53 } 54 }
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术