第一题
class Solution {
public int projectionArea(int[][] grid) {
int length=0;
int hangSum=0;
int lieSum=0;
int n=grid.length;
for(int i=0;i<n;i++){
int hangMax=0;
int lieMax=0;
for(int j=0;j<n;j++){
if(grid[i][j]!=0)
length++;
hangMax=Math.max(hangMax,grid[i][j]);
lieMax=Math.max(lieMax,grid[j][i]);
}
hangSum+=hangMax;
lieSum+=lieMax;
}
return hangSum+lieSum+length;
}
}
思路:三个视图的面积分别是数组中不为零元素的个数,每行中元素的最大值之和,每列中元素的最大值之和。三者相加就是视图的面积。
第二题:
class Solution {
public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
if (Arrays.equals(p1, p2)) {
return false;
}
if (help(p1, p2, p3, p4)) {
return true;
}
if (Arrays.equals(p1, p3)) {
return false;
}
if (help(p1, p3, p2, p4)) {
return true;
}
if (Arrays.equals(p1, p4)) {
return false;
}
if (help(p1, p4, p2, p3)) {
return true;
}
return false;
}
public boolean help(int[] p1, int[] p2, int[] p3, int[] p4) {
int[] v1 = {p1[0] - p2[0], p1[1] - p2[1]};
int[] v2 = {p3[0] - p4[0], p3[1] - p4[1]};
if (checkMidPoint(p1, p2, p3, p4) && checkLength(v1, v2) && calCos(v1, v2)) {
return true;
}
return false;
}
public boolean checkLength(int[] v1, int[] v2) {
return (v1[0] * v1[0] + v1[1] * v1[1]) == (v2[0] * v2[0] + v2[1] * v2[1]);
}
public boolean checkMidPoint(int[] p1, int[] p2, int[] p3, int[] p4) {
return (p1[0] + p2[0]) == (p3[0] + p4[0]) && (p1[1] + p2[1]) == (p3[1] + p4[1]);
}
public boolean calCos(int[] v1, int[] v2) {
return (v1[0] * v2[0] + v1[1] * v2[1]) == 0;
}
}
思路:首先判断p1和其余三个点的其中一个是否重合,不重合的话,接着判断四个点两两之间长度是否为1,所组成的对角线中点是否重合,对边是否平行。如果是,返回true,否则交换其余三个点的位置,继续判断是否符合条件。(每次都先假设某个点是p1的对点)
第三题:
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int nums[]=new int[10];
for(int i=0;i<10;i++){
nums[i]=2021;
}
for(int i=1;i<100000;i++){
int k=i;
while(k>0){
nums[k%10]--;
k=k/10;
}
for(int j=0;j<10;j++){
if(nums[j]==0){
System.out.println(i);
return;
}
}
}
scan.close();
}
}
思路:首先创建一个有十个元素的数组,每个元素初始值都是2021。用数组里的元素拼数字,每用一个数字,对应元素减一,当某个元素先变成0后,就返回所拼数字的大小。