9.25用友笔试

题目见上。
第一题直接用链表模拟了。
就用Java的LinkedList实现,怎么实现环形呢,直接把头元素取出再加到尾,这就是环了
    public int shrinkCircle (int[] circle) {
        //用链表模拟
        LinkedList<Integer> data = new LinkedList<>();
        //原来要从1开始找
        int i = 0;
        for(; i < circle.length; i++){
            if(circle[i] == 1){
                break;
            }
            data.addLast(circle[i]);
        }
        //出来的时候i是1的位置,那再从末尾元素加到i的位置
        for(int j = circle.length - 1; j >= i; j--){
            data.addFirst(circle[j]);
        }
        //这样子出现的就是
        //1到末尾元素,第一个元素到1的之前
        int remainder = 1;
        while(data.size() > 1){
            Integer temp = data.removeFirst();
            if(temp % 4 == remainder){
                remainder++;
                if(remainder == 4){
                    remainder = 0;
                }
                //符合条件就不要加回去了,就从环中剔除了该元素
                continue;
            }
            data.addLast(temp);
        }
        //只剩最后一个了
        return data.getFirst();
    }
第二题,是力扣62题不同路径和牛客这题的进阶
不同路径的数目(一)_牛客题霸_牛客网 (nowcoder.com)
只是难以使用递推的方式递推(反正我没想出来),直接记忆化搜索解决问题吧。
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param x int整型 目标点的X坐标
     * @param y int整型 目标点的Y坐标
     * @param z int整型 目标点的Z坐标
     * @return long长整型
     */
    public long countPaths (int x, int y, int z) {
        long[][][] memo = new long[x + 1][y + 1][z + 1];
        //base case
        //从起点到起点只有一种路径,那就是站着不动,这就是唯一的base case
        memo[0][0][0] = 1;
        return dp(memo, x, y, z);
    }
    //采用记忆化搜索的办法
    private long dp(long[][][] memo, int x, int y, int z){
        //dp含义,从0,0,0到x,y,z的路径数量
        //状态转移
        //依据题意,每次都只能沿着三条坐标轴之一移动一个方向,所以到达x,y,z这个点的,只可能有这三种情况
        //从x-1,y,z过来,从x,y-1,z过来,从x,y,z-1过来
        //因此状态转移方程为
        //dp[x][y][z] = dp[x-1][y][z] + dp[x][y-1][z] + dp[x][y][z-1]
        if(x == -1 || y == -1 || z == -1){
            return 0;
        }
        if(memo[x][y][z] != 0){
            return memo[x][y][z];
        }
        //只能从三个方向而来
        long res = dp(memo, x - 1, y, z) + dp(memo, x, y - 1, z) + dp(memo, x, y, z - 1);
        memo[x][y][z] = res;
        return memo[x][y][z];
    }


第三题,力扣300题最长递增子序列原题。牛客上此题连接:最长上升子序列(一)_牛客题霸_牛客网 (nowcoder.com)
    public int lengthOfLIS(int[] nums) {
        //dp数组的含义为,dp[i]的值是以nums[i]结尾的最长递增子序列长度
        //base case为dp[i] = 1,因为递增子序列最少包括自身,自然长度为1
        //状态转移
        //从左往右找,限定j为0到i-1之间
        //当nums[i] > nums[j]
        //dp[i] = MAX { dp[j] + 1 , dp[i] }
        int[] dp = new int[nums.length];
        int res = 1;
        Arrays.fill(dp , 1);
        for(int i = 1; i < dp.length; i++){
            for(int j = 0; j < i; j++){
                if(nums[i] > nums[j]){
                    dp[i] = Math.max(dp[i] , dp[j] + 1);
                }
            }
            res = Math.max(dp[i] , res);
        }
        return res;
    }


#用友校招##用友##用友2022届校园招聘#
全部评论
同学同花顺尝试一下吗,面试简单不造火箭,可保姆式全程跟进度,我帖子有内推
点赞 回复 分享
发布于 2022-09-25 20:01 浙江
抄一抄
点赞 回复 分享
发布于 2022-09-26 16:37 江西
兄弟手撕嘛?
点赞 回复 分享
发布于 2022-11-02 10:37 四川

相关推荐

2 8 评论
分享
牛客网
牛客企业服务