8.2号 shopee提前批 Java工程师 笔试题

Posted 尚墨1111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8.2号 shopee提前批 Java工程师 笔试题相关的知识,希望对你有一定的参考价值。

2.1 shopee提前批笔试-8.2

2.1.1 编程一:动态规划

数的划分,将整数n分成k份,且每份不能为空,任意两种划分方案不能相同

思考:方案数,最大值,不能穷举,极大可能是动态规划。

1、涉及到两个变量 n和k 所以应该是需要二维数组,dp [i] [j]

2、dp [i] [j] 代表 i 个数分成 j 份

3、怎么分解 dp [i] [j]?

  • 拿到一个整数 i ,因为题目中要求每份不能为空,因此必须先拿出 j 个数位将 j 份分别放上1,此时剩下 i - j个数。
  • 那么剩下的数如何处理呢?可以将其全部分到一份当中(dp[i-j] [1]),也可以分到两份中(dp[i-j] [2]),…,也可以分到 j 份中(dp[i-j] [j]),而每一种分法都是不相同的,所以可以将其全部加起来,和即为dp[i] [j]。
  • 这里其实就已经去重了,因为分到两份去,并没有指定是那两份,所以根本没关系,只加了一次。


4、到这里已经可以写了,但是跟我们平常的状态方程不一样,尝试化简


5、两个式子一起化简得,即为本题状态转移方程,直接还真不好想?


6、遍历的方向,只知道基线是0个数字分成0个分发是一种,其他没有已知条件,正向遍历。

总结:

1、尝试dp[i-1] [j-1]、dp[i] [j-1] 、dp[i-1] [j] 这三部分来推导 dp[i] [j]

2、如果不行,能不能考虑缩小问题的范围方向

	// 输入:两个整数n,k(6<n<=200,2<=k<=6)。
	// 输出一个整数,即有几种不同的分法。
    public int  divide(int n,int k){
        if(n==0|| k==0) return 0;
        int[][] dp = new int[n+1][k+1];
        dp[0][0] = 1;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= k; j++) {
                //划分的份数不能超过给定的整数,既满足不能为空的条件
                if(i>=j){
                    dp[i][j] = dp[i-j][j]+dp[i-1][j-1];
                }
            }
        }
        return dp[n][k];
    }

2.1.2 编程二:二分法

一个数组,找到一个数的下标,该数左边的所有数和 与右边的所有数和相同。若有多个,返回第一个

思路一:从头到尾遍历数组,计算左边之和,右边之和,比较它们。

思路二:双指针,首尾遍历,根据和来判断是左移还是右移

思路三:二分法,如果左边的值*2=数组的和-当前位置的值,那么就可以说找到了,如果大于,那就向前移动,小于就向后移动。

// 二分法
public int findBalancedIndex(int[] arr){
        if(arr==null || arr.length==0) return -1;
        int left = 0,right = arr.length-1;

        int total = 0;
        for (int i = 0; i < arr.length; i++) {
            total+=arr[i];
        }
        while(left<right){
            int mid = left+ (right-left)/2;
            int leftTotal = 0;
            for (int i = 0; i < mid; i++) {
                leftTotal+=arr[i];
            }
            if(leftTotal*2==total-arr[mid]) return mid;
            else if(leftTotal*2<total-arr[mid]) left = mid;
            else  right = mid;
        }
        return -1;
    }

//暴力求解
    public int findBalancedIndex(int[] inputArray) {
        int sum = 0;
        for (int i : inputArray) {
            sum += i;
        }

        int sum2 = 0;
        for (int i = 0; i < inputArray.length; i++) {
            if (sum2 * 2 + inputArray[i] == sum) {
                return i;
            }

            sum2 += inputArray[i];
        }

        return -1;
    }

2.1.3 编程三:栈+状态机

XML解析。

<people><name>shopee</name></people> ,输入people.name返回shopee,输入people.age返回 “ ”

以上是关于8.2号 shopee提前批 Java工程师 笔试题的主要内容,如果未能解决你的问题,请参考以下文章

(4道全A)拼多多2021届提前批-服务端研发工程师笔试

米哈游2023秋季招聘正式开始~提前批有机会免笔试!

最后一周!4000+HC免笔试!字节跳动2022校招研发提前批倒计时

java笔试题库app,写的太详细了

大疆笔试——机器学习提前批

拼多多2018提前批前端笔试总结