阿里巴巴3.25笔试

第一题

看明白了较为简单,暴力可以做,但是知道肯定要超时,所以不敢做,然后去做了第二题,做的同时在想第一题,然后想到了用了dp,dp就三行,挺简单的。
不过这个也只过了75%。。。。求大佬们双AC的解法
对了这道题要注意的地方是,dp数组要用long,用int的话通过率更低
public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] num = new int[3][n];
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < n; j++) {
                num[i][j] = sc.nextInt();
            }
        }
        long[][] dpNum = new long[n][3];
        for (int i = 1; i < n; i++) {
            dpNum[i][0] = Math.min(Math.abs(num[0][i] - num[0][i - 1]) + dpNum[i - 1][0], Math.min(Math.abs(num[0][i] - num[1][i - 1]) + dpNum[i - 1][1], Math.abs(num[0][i] - num[2][i - 1]) + dpNum[i - 1][2]));
            dpNum[i][1] = Math.min(Math.abs(num[1][i] - num[0][i - 1]) + dpNum[i - 1][0], Math.min(Math.abs(num[1][i] - num[1][i - 1]) + dpNum[i - 1][1], Math.abs(num[1][i] - num[2][i - 1]) + dpNum[i - 1][2]));
            dpNum[i][2] = Math.min(Math.abs(num[2][i] - num[0][i - 1]) + dpNum[i - 1][0], Math.min(Math.abs(num[2][i] - num[1][i - 1]) + dpNum[i - 1][1], Math.abs(num[2][i] - num[2][i - 1]) + dpNum[i - 1][2]));
        }
        System.out.println(Math.min(dpNum[n - 1][0], Math.min(dpNum[n - 1][1],dpNum[n - 1][1])));
    }
第二题

也是暴力,30%,思路大致是:
  1. 遍历行,有两个不为0的那么这一行可以改,但是要排除全都不是0的情况
  2. 然后遍历列,方法同上
  3. 利用是否修改了行/列的标志chan来记录这一行/这一列是否修改了
  4. 如果都未修改,推出循环。
  5. 先做的第二题,想尝试优化,但是看时间只有20多分钟了,直接去做第一题了。。。。太菜了。。。
  6. 优化方案:将已经修改过的行/列记录到map中,时间复杂度可优化为2mn级别,应该可以ac
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int q = sc.nextInt();
        int[][] nums = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                nums[i][j] = sc.nextInt();
            }
        }
        int[][] ques = new int[q][2];
        for (int i = 0; i < q; i++) {
            ques[i][0] = sc.nextInt();
            ques[i][1] = sc.nextInt();
        }
        sc.close();
        boolean chan = true;
        while (chan) {
            chan = false;
            boolean chaned = false;
            boolean chaned2 = false;
            //遍历行
            for (int i = 0; i < n; i++) {
                int left = -1, right = -1;
                for (int j = 0; j < m; j++) {
                    if (nums[i][j] != 0) {
                        if (left == -1) left = j;
                        else if (right == -1) right = j;
                    }else chaned = true;
                }
                if (left != -1 && right != -1 && chaned) {
                    int cut = (nums[i][right] - nums[i][left]) / (right - left);
                    for (int k = 0; k < m; k++) {
                        if(!chan && nums[i][k] == 0) chan = true;
                        nums[i][k] = nums[i][left] + cut * (k - left);
                    }
                }
            }
            //遍历列
            for (int j = 0; j < m; j++) {
                int up = -1, down = -1;
                for (int i = 0; i < n; i++) {
                    if(nums[i][j] != 0){
                        if (up == -1) up = i;
                        else if (down == -1) down = i;
                        else continue;
                    }else chaned2 = true;
                }
                if(up != -1 && down != -1 && chaned2){
                    int cut = (nums[down][j] - nums[up][j]) / (down - up);
                    for (int k = 0; k < n; k++) {
                        if(nums[k][j] == 0) chan = true;
                        nums[k][j] = nums[k][up] + cut * (k - up);
                    }
                }
            }
        }
        for (int i = 0; i < q; i++) {
            if(nums[ques[i][0] - 1][ques[i][1] - 1] != 0){
                System.out.println(nums[ques[i][0] - 1][ques[i][1] - 1]);
            }else System.out.println("Unknown");
        }
    }
}


#阿里笔试第三场0325##阿里巴巴##笔试题目#
全部评论
昨天做了360感觉太简单,今天就被阿里虐哭了,真的是太菜了。。。时间完全不够用
点赞 回复 分享
发布于 2020-03-25 17:28

相关推荐

点赞 评论 收藏
分享
评论
2
7
分享

创作者周榜

更多
正在热议
更多
# AI面会问哪些问题? #
24732次浏览 486人参与
# 中国电信笔试 #
31057次浏览 283人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
14116次浏览 209人参与
# 你的实习产出是真实的还是包装的? #
18749次浏览 330人参与
# 如果秋招能重来,我会____ #
96686次浏览 500人参与
# 春招至今,你的战绩如何? #
59737次浏览 538人参与
# 米连集团26产品管培生项目 #
12945次浏览 285人参与
# i人适合做什么工作 #
36905次浏览 124人参与
# 我是面试官,请用一句话让我破防 #
79508次浏览 219人参与
# 哪些公司真双非友好? #
69191次浏览 287人参与
# 找AI工作可以去哪些公司? #
7652次浏览 183人参与
# 从事AI岗需要掌握哪些技术栈? #
7630次浏览 244人参与
# 面试尴尬现场 #
220747次浏览 861人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
339882次浏览 2165人参与
# 五一之后,实习真的很难找吗? #
102796次浏览 584人参与
# 金三银四,你的春招进行到哪个阶段了? #
21544次浏览 277人参与
# 你做过最难的笔试是哪家公司 #
29991次浏览 187人参与
# 你小时候最想从事什么职业 #
159835次浏览 2072人参与
# 阿里笔试 #
176326次浏览 1302人参与
# 应届生第一份工资要多少合适 #
20476次浏览 84人参与
# 一张图晒出你司的标语 #
3805次浏览 72人参与
# 面试被问期望薪资时该如何回答 #
382455次浏览 2163人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务