9.17,网易游戏(互娱)笔试,第二题

 

1、题目

9.17,网易游戏(互娱)笔试,第二题

 9.17,网易游戏(互娱)笔试,第二题

 9.17,网易游戏(互娱)笔试,第二题

 

2、思路

和之前做的,阿里排水井的题,有点像,但这个要简单很多。

 

求小易视野外,互相看不见的人个数。

(1)整体思路就是,找凹槽的个数。

  我找的是高地的个数,凹槽=高地+1。

(2)具体细节,根据小易的位置,需要减一些数。

  小易在高地,凹槽=凹槽-2,也就是两边在视野范围内,不算数。

  小易在凹槽,凹槽=凹槽-1,也就是小易占了一个凹槽,不带他自己。

 

代码逻辑:

/*
* (1)寻找高地个数:合一
*      平台合一:相当于去重,省去不必要的麻烦。
*      list转为新数组
*      高地合一:有多少凹槽,就可以有多少隐蔽人数。
*          对哦,其实可以直接统计凹槽啊!两端特殊处理就好!【其实一样,也不会简化,就不写了】
*
* (2)隐蔽人数=高地个数(-1)
*      如果小易在凹槽,小易占用一个凹的隐蔽位置,是凹数-1,即高地数。
*      如果小易在局部最高点,考虑TMD小易视野之外!!所以是凹数-2,即高地数-1!!
*          用平台合一之后的新数组判断即可,很好判断。
*
*/

 

菜鸟,没用什么巧妙的招式,纯粹严谨的代码逻辑。

 

3、代码

9.17,网易游戏(互娱)笔试,第二题
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;
        }
    }

}
View Code

 

9.17,网易游戏(互娱)笔试,第二题

上一篇:网站测试内容有哪些,怎么提高网站测试的质量?


下一篇:20210823每日总结