算法:这个真的好亏好亏,自己面试的时候紧张到抽风了,一个简单的单调栈问题居然写了半个小时都写不出来,事后冷静了一下,写了出来并优化了一下。
题目:
逛街
小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
输出
3 3 5 4 4 4
说明
当小Q处于位置3时,他可以向前看到位置2,1处的楼,向后看到位置4,6处的楼,加上第3栋楼,共可看到5栋楼。当小Q处于位置4时,他可以向前看到位置3处的楼,向后看到位置5,6处的楼,加上第4栋楼,共可看到4栋楼 。
自己后来写的代码:
import java.util.*; public class Main { public static void main(String[] args) { int n = 6; int nums[] = {5,3,8,3,2,5}; int res[] = new int[n]; Stack<Integer> stack = new Stack<>(); for(int i=0; i<n; i++) res[i] += see(stack, nums[i]); stack.clear(); for(int i=n-1; i>=0; i--) res[i] += see(stack, nums[i]); for(int i=0; i<n; i++) { res[i]--; System.out.print(res[i]+" "); } } public static int see(Stack<Integer> stack, int num){ if(stack.isEmpty()){ stack.push(num); return 1; } int jian = 0; while(!stack.isEmpty()&&stack.peek()<=num) { jian++; stack.pop(); } stack.push(num); return jian+stack.size(); } }
面试问题:
1、B+和B树的区别
2、NoSQL的知道吗,讲一下,讲了NoSQl的一些概念
3、然后redis的实现,redis只会用,不会问题,说了不会,就跳过了
4、进程调度算法有哪些,分别说一下
5、四次挥手的过程,为什么最后要客户端要等2msl的时间
真的好亏好亏,好心通,问题会的都答了,希望能过,许愿许愿,面试官大人收下膝盖!!!
全部评论
(2) 回帖