备战蓝桥杯22弹

第一题

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后,就返回所拼数字的大小。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值