1、题目
2、思路
和之前做的,阿里排水井的题,有点像,但这个要简单很多。
求小易视野外,互相看不见的人个数。
(1)整体思路就是,找凹槽的个数。
我找的是高地的个数,凹槽=高地+1。
(2)具体细节,根据小易的位置,需要减一些数。
小易在高地,凹槽=凹槽-2,也就是两边在视野范围内,不算数。
小易在凹槽,凹槽=凹槽-1,也就是小易占了一个凹槽,不带他自己。
代码逻辑:
/* * (1)寻找高地个数:合一 * 平台合一:相当于去重,省去不必要的麻烦。 * list转为新数组 * 高地合一:有多少凹槽,就可以有多少隐蔽人数。 * 对哦,其实可以直接统计凹槽啊!两端特殊处理就好!【其实一样,也不会简化,就不写了】 * * (2)隐蔽人数=高地个数(-1) * 如果小易在凹槽,小易占用一个凹的隐蔽位置,是凹数-1,即高地数。 * 如果小易在局部最高点,考虑TMD小易视野之外!!所以是凹数-2,即高地数-1!! * 用平台合一之后的新数组判断即可,很好判断。 * */
菜鸟,没用什么巧妙的招式,纯粹严谨的代码逻辑。
3、代码
package 网易游戏; import java.util.LinkedList; import java.util.List; import java.util.Scanner; /** * 终于他妈的搞定了,我的天哪,2021年9月17日22:53:03 * * 我从21.00就开始做这道题,基本完成是22.00,但是有报错,提交失败。 * 完善是22.00-22.53,完善了一个小时,才把这3个用例跑通,还有没有其他情况未知啊! * * 题目:网易游戏第二题 * onenote:///G:\研究生\OneNote_git\专业\数据结构算法.one#网易笔试 * * OK,整理博客吧。2021-9-17 23:13 * */ public class Main2 { public static void main(String[] args) { //Scanner in = new Scanner(System.in); //int n = in.nextInt();//地形组数 // //for (int i = 0; i < n; i++) { // int N = in.nextInt();// 地形长度 // int M = in.nextInt();//小易位置 // int[] arr = new int[N]; // for (int j = 0; j < N; j++) { // arr[j] = in.nextInt();//Hi,地形高度 // } // System.out.println(findHighNum(arr)); // //} int[] arr = {0, 1, 0, 1, 0}; int M = 1;//2 //int[] arr = {0, 1, 0, 0, 2, 1, 0}; //int M = 1;//2 //int[] arr = {0, 1, 0, 0, 2, 1, 0}; //int M = 2;//1 System.out.println(findHighNum(arr, M - 1));//小易位置从1开始,不是0! } /** * * * (1)寻找高地个数:合一 * 平台合一:相当于去重,省去不必要的麻烦。 * list转为新数组 * 高地合一:有多少凹槽,就可以有多少隐蔽人数。 * 对哦,其实可以直接统计凹槽啊!两端特殊处理就好!【其实一样,也不会简化,就不写了】 * * (2)隐蔽人数=高地个数(-1) * 如果小易在凹槽,小易占用一个凹的隐蔽位置,是凹数-1,即高地数。 * 如果小易在局部最高点,考虑TMD小易视野之外!!所以是凹数-2,即高地数-1!! * 用平台合一之后的新数组判断即可,很好判断。 * * @return */ public static int findHighNum(int[] arr, int M) { //(1)合一 //1 平台合一 List<Integer> comList = new LinkedList<>(); for (int i = 0; i + 1 <= arr.length - 1; i++) { if (arr[i] == arr[i + 1]) { int start = i; int end = i + 1;//包含 i++; while (arr[i] == arr[i + 1]) { i++; } end = i; //把小易平台合一后的新位置更新了。 if (M <= start && M >= end) { M = start; } comList.add(arr[i]); } else { comList.add(arr[i]); if (i + 1 == arr.length - 1) {//边界,结尾处,加上最后一个元素 comList.add(arr[i + 1]); } } } System.out.println(comList); //list转为int[] arr = new int[comList.size()]; for (int i = 0; i < comList.size(); i++) { arr[i] = comList.get(i); } //2 高地合一 int highNum = 0; for (int i = 0; i + 2 <= comList.size() - 1; i++) { if (arr[i] < arr[i + 1] && arr[i + 1] > arr[i + 2]) {//高地是i+1 highNum++; } else if (arr[i] < arr[i + 1] && arr[i + 1] < arr[i + 2]) {//i+1上升阶梯 i++; while (i + 2 <= comList.size() - 1 && arr[i] < arr[i + 1] && arr[i + 1] < arr[i + 2]) { i++; } if (i + 2 <= comList.size() - 1 && arr[i] < arr[i + 1] && arr[i + 1] > arr[i + 2]) {//凹槽是i+1 highNum++; //continue;//如果是凹槽,下一步就又要判断是否是上升了,因此直接到for内开头。 } else { // i+1既不是上升,也不是凹槽,只能是下降了吧 i++; while (i + 2 <= comList.size() - 1 && arr[i] > arr[i + 1] && arr[i + 1] > arr[i + 2]) { i++; } //下降之后,要么是凹槽,要么是结束!非结束的时候,就是凹槽。 // 如果是结束,可能是越界,如果不越界,只需要for中间表达式去判断好了,也不用管了。 if (i + 2 <= comList.size() - 1 && arr[i] < arr[i + 1] && arr[i + 1] > arr[i + 2]) {//凹槽是i+1 highNum++; //continue;//如果是凹槽,下一步就又要判断是否是上升了,因此直接到for内开头。 } //else { //如果不越界,只需要for中间表达式去判断好了,也不用管了。 //} } } else {//如果是下降就copy上面内部if-else,下降处理的代码。 i++; while (i + 2 <= comList.size() - 1 && arr[i] > arr[i + 1] && arr[i + 1] > arr[i + 2]) { i++; } //下降之后,要么是结束!非结束的时候,就是凹槽。 if (i + 2 <= comList.size() - 1 && arr[i] < arr[i + 1] && arr[i + 1] > arr[i + 2]) {//凹槽是i+1 highNum++; } } } //(2)判断小易是否在最高点。 boolean flag = false;//默认不在最高点,也就是highNum直接返回 if (M != 0 && M != arr.length && (arr[M + 1] < arr[M] && arr[M] > arr[M - 1])) { flag = true; } if (flag) { return highNum - 1; } else { return highNum; } } }