第一题
很简单的一道题,输入一个整型数组,找出其中出现次数超过一半以上的元素,输出该元素。
比如:
输入:
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) 回帖