首页 > 笔经面经 > 2021/6/16华为OD机考试题

2021/6/16华为OD机考试题

头像
406穷光蛋 #华为od#
发布于 2021-06-16 16:28:35 APP内打开
赞 3 | 收藏 27 | 回复3 | 浏览3319

第一题

很简单的一道题,输入一个整型数组,找出其中出现次数超过一半以上的元素,输出该元素。

比如:

输入:

1,5,9,5,5,4,8,5,5

输出:

5

第二题

LeetCode 1319. 连通网络的操作次数

连通网络的最少操作次数,在leetcode上有原题。

第三题

有 n 个互不相同的坐标点 ,坐标值都为整数,存在 int[][] points 中,问由这些点可以组成多少个等腰直角三角形,其中最大的等腰直角三角形的面积是多少?

输入:第一行是一个整数 n,表示有 n 个点,接下来的 n 行数据表示 n 个 (x,y) 坐标点,x 和 y 之间用空格隔开。

3 
1 1
1 2
2 1

输出:第一个数字表示有多少个等腰直角三角形,第二个表示最大的等腰直角三角形面积(保留两位小数)。

1 0.50

这道题暴力循环就可以做出来,但是会有个坑,就是 double 类型的数字进行大小比较时,不能用 == ,比如 a==b 要写成 Math.abs(a-b)<0.1

我的代码实现:

import java.util.Scanner;

public class Main {
    /**
     * // 判断这三个点是否可以构成等腰直角三角形
     * @param x1
     * @param y1
     * @param x2
     * @param y2
     * @param x3
     * @param y3
     * @return 如果是等腰直角三角形,返回面积,如果不是,返回-1
     */
    public static double isRT(int x1,int y1, int x2, int y2,int x3, int y3){
        double a = getInstance(x1,y1,x2,y2);
        double b = getInstance(x1,y1,x3,y3);
        double c = getInstance(x2,y2,x3,y3);
        // a 作为底边
        if(a>b && a>c){
            if(Math.abs(c-b)<0.1 && Math.abs(Math.pow(b,2)+Math.pow(c,2)-Math.pow(a,2)) < 0.1) return c*b*0.5;
            return -1.0;
        }
        // b 作为底边
        if(b>a && b>c){
            if(Math.abs(c-a)<0.1 && Math.abs(Math.pow(a,2)+Math.pow(c,2)-Math.pow(b,2)) < 0.1) return c*a*0.5;
            return -1.0;
        }
        // c 作为底边
        if(c > a && c>b){
            if(Math.abs(a-b)<0.1 && Math.abs(Math.pow(a,2)+Math.pow(b,2)-Math.pow(c,2)) < 0.1) return a*b*0.5;
            return -1.0;
        }
        // 无法构成等腰直角三角形
        return -1.0;

    }

    // 两点之间的长度
    public static double getInstance(int x1,int y1, int x2,int y2){
        return Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    }

    public static void main(String[] args) {
        // 输入数据
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[][] points = new int[n][2];
        for(int i=0; i<n; i++){
            points[i][0] = in.nextInt();
            points[i][1] = in.nextInt();
        }

        // 处理数据
        int count = 0;
        double maxS = 0.0;
        for(int i=0; i<n; i++){
            for(int j=i+1; j<n; j++){
                for(int k=j+1; k<n; k++){
                    double s = isRT(points[i][0],points[i][1], points[j][0],points[j][1], points[k][0],points[k][1]);
                    if(s > 0.0){
                        count++;
                        maxS = Math.max(maxS,s);
                    }
                }
            }
        }

        // 输出数据
        System.out.print(count + " " + String.format("%.2f",maxS));
    }
}

3条回帖

回帖
加载中...
话题 回帖

推荐话题

相关热帖

笔经面经近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐