通过万岁!!!
- 题目:给你四个点判断是不是正方形。
- 思路:判断正方形的方式有很多,我采用的是两条边相等,并且成直角。然后再找一组即可。只不过这里点的顺序不一样,所以存在三种情况。从1开始触发,1234,1243,1324。如果不理解,可以自己画图看看。然后我们就判断12和13或者12和14或者13和14,然后再判断另外两条边和形成的角即可。
- 技巧:图形的判断
java代码——冗长一点的
class Solution {
public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
if (p1[0] == p2[0] && p1[1] == p2[1]) {// 四个重复的点
return false;
}
int side12 = (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]);
int side13 = (p1[0] - p3[0]) * (p1[0] - p3[0]) + (p1[1] - p3[1]) * (p1[1] - p3[1]);
int side14 = (p1[0] - p4[0]) * (p1[0] - p4[0]) + (p1[1] - p4[1]) * (p1[1] - p4[1]);
if (side12 == side13 && isVer(p1, p2, p3)) {// 1243
int side34 = (p3[0] - p4[0]) * (p3[0] - p4[0]) + (p3[1] - p4[1]) * (p3[1] - p4[1]);
int side24 = (p2[0] - p4[0]) * (p2[0] - p4[0]) + (p2[1] - p4[1]) * (p2[1] - p4[1]);
if (side34 == side24 && isVer(p4, p3, p2)) {// 菱形,还得有一个直角
return true;
} else {
return false;
}
}
if (side12 == side14 && isVer(p1, p2, p4)) {// 1234
int side34 = (p3[0] - p4[0]) * (p3[0] - p4[0]) + (p3[1] - p4[1]) * (p3[1] - p4[1]);
int side23 = (p2[0] - p3[0]) * (p2[0] - p3[0]) + (p2[1] - p3[1]) * (p2[1] - p3[1]);
if (side34 == side23 && isVer(p3, p4, p2)) {// 菱形,还得有一个直角
return true;
} else {
return false;
}
}
if (side13 == side14 && isVer(p1, p4, p3)) {// 1324
int side23 = (p3[0] - p2[0]) * (p3[0] - p2[0]) + (p3[1] - p2[1]) * (p3[1] - p2[1]);
int side24 = (p2[0] - p4[0]) * (p2[0] - p4[0]) + (p2[1] - p4[1]) * (p2[1] - p4[1]);
if (side23 == side24 && isVer(p2, p3, p4)) {// 菱形,还得有一个直角
return true;
} else {
return false;
}
}
return false;
}
public boolean isVer(int[] p1, int[] p2, int[] p3) {// 12与13垂直
if ((p1[1] - p2[1]) * (p1[1] - p3[1]) + (p1[0] - p3[0]) * (p1[0] - p2[0]) == 0) {
return true;
} else {
return false;
}
}
}
java代码——整理过后
class Solution {
public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
if (p1[0] == p2[0] && p1[1] == p2[1]) {// 四个重复的点
return false;
}
int side12 = calculateSeid(p1, p2);
int side13 = calculateSeid(p1, p3);
int side14 = calculateSeid(p1, p4);
if (side12 == side13 && isVer(p1, p2, p3)) {// 1243
if (calculateSeid(p3, p4) == calculateSeid(p2, p4) && isVer(p4, p3, p2)) {// 菱形,还得有一个直角
return true;
} else {
return false;
}
}
if (side12 == side14 && isVer(p1, p2, p4)) {// 1234
if (calculateSeid(p3, p4) == calculateSeid(p2, p3) && isVer(p3, p4, p2)) {// 菱形,还得有一个直角
return true;
} else {
return false;
}
}
if (side13 == side14 && isVer(p1, p4, p3)) {// 1324
if (calculateSeid(p2, p3) == calculateSeid(p2, p4) && isVer(p2, p3, p4)) {// 菱形,还得有一个直角
return true;
} else {
return false;
}
}
return false;
}
// 计算垂直
public boolean isVer(int[] p1, int[] p2, int[] p3) {// 12与13垂直
if ((p1[1] - p2[1]) * (p1[1] - p3[1]) + (p1[0] - p3[0]) * (p1[0] - p2[0]) == 0) {
return true;
} else {
return false;
}
}
public int calculateSeid(int[] p1, int[] p2) {
return (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]);
}
}
- 总结:题目还是比较简单的,但是可能有些许的繁琐。并且用到了一些数学方面的知识。这里不太严谨,其实我求的边长是实际变长的平方。