第一题
很简单的一道题,输入一个整型数组,找出其中出现次数超过一半以上的元素,输出该元素。
比如:
输入:
1,5,9,5,5,4,8,5,5
输出:
5
第二题
连通网络的最少操作次数,在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) 回帖