华为OD机试真题——矩形相交的面积(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

发布于:2025-05-30 ⋅ 阅读:(24) ⋅ 点赞:(0)

在这里插入图片描述

2025 A卷 100分 题型

本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享

华为OD机试真题《矩形相交的面积》:


文章快捷目录

题目描述及说明

Java

python

JavaScript

C

GO


题目名称:矩形相交的面积


  1. 知识点:几何计算、边界判断
  2. 时间限制:1秒
  3. 空间限制:256MB
  4. 限定语言:不限

题目描述

在平面直角坐标系中,给定3个矩形,每个矩形由其左上角坐标(x, y)、宽度(w)和高度(h)表示,格式为 (x, y, w, h)。其中:

  • x, y 为矩形左上角的坐标,满足 -1000 ≤ x, y < 1000
  • w, h 为正整数,表示矩形向右延伸 w 单位、向下延伸 h 单位。
  • 矩形区域定义为:x轴范围 [x, x+w),y轴范围 [y-h, y)

输入描述
输入共3行,每行包含4个整数,分别表示一个矩形的 x, y, w, h

输出描述
输出3个矩形相交区域的面积,若不相交则输出 0

示例
输入:

1 6 4 4  
3 5 3 4  
0 3 7 3  

输出:

2  

说明:三个矩形相交的区域面积为2。


Java

问题分析

我们需要计算三个矩形的相交区域面积。每个矩形由其左上角坐标 (x, y)、宽度 (w) 和高度 (h) 定义,其中矩形在 x 轴的范围是 [x, x + w),在 y 轴的范围是 [y - h, y)。三个矩形相交的面积是它们在 x 轴和 y 轴上共同重叠区域的乘积。

解题思路

  1. 解析输入:读取三个矩形的参数。
  2. 计算每个矩形的坐标范围:将每个矩形的 x 轴和 y 轴范围表示为区间。
  3. 求交集:找到三个矩形在 x 轴和 y 轴上的最大左边界和最小右边界。
  4. 计算面积:若交集存在(即左边界 < 右边界),面积即为宽高乘积,否则为 0。

代码实现

import java.util.Scanner;

public class Main {
   
    public static void main(String[] args) {
   
        Scanner scanner = new Scanner(System.in);

        // 读取并解析三个矩形的参数
        int[][] rects = new int[3][4];
        for (int i = 0; i < 3; i++) {
   
            String line = scanner.nextLine().trim();
            String[] parts = line.split("\\s+");
            for (int j = 0; j < 4; j++) {
   
                rects[i][j] = Integer.parseInt(parts[j]);
            }
        }

        // 计算每个矩形的x轴和y轴范围
        int[] xStarts = new int[3];
        int[] xEnds = new int[3];
        int[] yStarts = new int[3];
        int[] yEnds = new int[3];
        for (int i = 0; i < 3; i++) {
   
            int x = rects[i][0];
            int y = rects[i][1];
            int w = rects[i][2];
            int h = rects[i][3];
            xStarts[i] = x;                // x轴左边界
            xEnds[i] = x + w;              // x轴右边界
            yStarts[i] = y - h;            // y轴下边界
            yEnds[i] = y;                  // y轴上边界
        }

        // 计算x轴的交集:最大左边界和最小右边界
        int maxXStart = Math.max(xStarts[0], Math.max(xStarts[1], xStarts[2]));
        int minXEnd = Math.min(xEnds[0], Math.min(xEnds[1], xEnds[2]));
        int width = minXEnd - maxXStart;   // 交集宽度

        // 计算y轴的交集:最大下边界和最小上边界
        int maxYStart = Math.max(yStarts[0], Math.max(yStarts[1], yStarts[2]));
        int minYEnd = Math.min(yEnds[0], Math.min(yEnds[1], yEnds[2]));
        int height = minYEnd - max