2021/7/22 阿里笔试题

第一题:

题目描述:

对于分数Xi / Yi ,我们给T组数据,n表示每组数据有n个分数,让这些分数相加看是否能等于一个整数,如果相加为整数返回Yes,否则返回No。

用例数据:

2
3
1 2
1 3
1 6
4
2 3
4 6
2 6
3 8

Yes
No

我的思路是从头到尾两两合并,合并到最后看分子和分母如果相等就为Yes。

合并的话,要求分母的最小公倍数(可我不会求,菜狗啊!!!),然后合并

下面是我的代码,我本地调试没问题,但是保存运行他总说我超出边界,zero/0,是除数为零了?还是超出边界了?不知道啊。

下面是菜狗的没成功的代码:

import java.util.Scanner;

/**
 * @author keboom
 * @date 2021/7/21
 */
public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        String[] result = new String[T];
        for (int i = 0; i < T; i++) {
            int n = sc.nextInt();
            int[] x = new int[n];
            int[] y = new int[n];
            for (int j = 0; j < n; j++) {
                x[j] = sc.nextInt();
                y[j] = sc.nextInt();
                if (x[j] == 0) {
                    result[i] = "Yes";
                    break;
                }
            }
            boolean res = sum(x, y);
            if (res) {
                result[i] = "Yes";
            } else {
                result[i] = "No";
            }
        }

        for (int i = 0; i < T; i++) {
            System.out.println(result[i]);
        }
    }

    public static boolean sum(int[] x, int[] y){
        int[] res = {x[0],y[0]};
        for (int i = 1; i < x.length; i++) {
            int[] merge = merge(res[0], res[1], x[i], y[i]);
            res[0] = merge[0];
            res[1] = merge[1];
        }
        if (res[0] == res[1]) {
            return true;
        } else {
            return false;
        }
    }

    public static int[] merge(int x1, int y1,int x2,int y2) {
        int mu = 1;
        if (y2 % y1 == 0) {
            mu = y2;
            x1 = y2/y1 * x1;
        } else {
            mu = y1 * y2;
            x1 = y2 * x1;
            x2 = y1 * x2;
        }
        int x = x1 + x2;
        return new int[]{x, mu};
    }
}

第二题是什么牛额,应该时动态规划,没来得及看

#阿里笔试##笔经##阿里巴巴#
全部评论
我也是一直除零错误。。。
点赞 回复 分享
发布于 2021-07-22 12:07
牛牛那个实在是规划不懂啊
点赞 回复 分享
发布于 2021-07-22 14:15
我觉得出现除零错误可能是你这种没有及时约分,可能溢出了???
点赞 回复 分享
发布于 2021-07-22 16:13
如何求最小公倍数? 两数之积 = 最大公约数 * 最小公倍数 比如 2 和 3 的最大公约数为1,最小公倍数为6 。 2 * 3 = 1 * 6 比如 15 和27 的最大公约数为 3,最小公倍数为135 。 15 * 27 = 3 * 135 使用辗转相除法求最大公约数:     public static int fa(int a, int b) {         int small = a > b ? b : a;         int big = a > b ? a : b;         int tmp = 0;         while (small != 0) {             tmp = small;             small = big % small;             big = tmp;         }         return big;     } 我们进行测试:     public static void main(String[] args) {         int a = 27;         int b = 15;         // 那么我们可以求最小公倍数了!         int minBei = a * b / fa(a, b);         System.out.println(minBei);     }
点赞 回复 分享
发布于 2021-07-22 18:01
  这是我写的 public static int t;     public static int n;     public static void main(String[] args) {         Scanner scanner=new Scanner(System.in);         t = scanner.nextInt();         n=scanner.nextInt();         int[][] ints=new int[n][2];         while (t>0){             for (int i = 0; i < n; i++) {                 ints[i][0]=scanner.nextInt();                 ints[i][1]=scanner.nextInt();             }             System.out.println();             isInt(ints);             t--;         }     }     public static void isInt(int[][] ints) {         int fm=1,fz=0;         for (int i = 0; i < n; i++) {             if (fm%ints[i][1]!=0){                 fm*=ints[i][1];                 fz=(fz*ints[i][1])+((fm/ints[i][1])*ints[i][0]);             }else {                 fz+=(fm/ints[i][1])*ints[i][0];             }         }         if (fz==fm) {             System.out.print("YES");         } else {             System.out.print("NO");         }     }
点赞 回复 分享
发布于 2021-08-02 11:36

相关推荐

2024-12-26 12:43
北京大学 算法工程师
华为 15级别 31k 公积金5%
点赞 评论 收藏
分享
评论
2
8
分享
牛客网
牛客企业服务