第一题:矩形面积(回顾)

给你 二维 平面上两个 由直线构成且边与坐标轴平行/垂直 的矩形,请你计算并返回两个矩形覆盖的总面积。

每个矩形由其 左下 顶点和 右上 顶点坐标表示:

第一个矩形由其左下顶点 (ax1, ay1) 和右上顶点 (ax2, ay2) 定义。
第二个矩形由其左下顶点 (bx1, by1) 和右上顶点 (bx2, by2) 定义。

 

输入:ax1 = -3, ay1 = 0, ax2 = 3, ay2 = 4, bx1 = 0, by1 = -1, bx2 = 9, by2 = 2
输出:45
示例 2:

输入:ax1 = -2, ay1 = -2, ax2 = 2, ay2 = 2, bx1 = -2, by1 = -2, bx2 = 2, by2 = 2
输出:16
 

提示:

-104 <= ax1, ay1, ax2, ay2, bx1, by1, bx2, by2 <= 104

 

思路:

1、首先明确计算的是两个矩形覆盖的总面积

2、其次给定的条件为四个顶点的坐标,即可通过数学的计算方法

3、分析后可知有俩种情况:一、两个矩形没有重叠即两个矩形的总面积即总面积;二、两个矩形重叠即可通过算出两个矩形的总面积后再减去重叠的面积;

  所以无论如何都得算出两个矩形的面积,而题目的重点在于算重叠面积!!!

  重叠面积(通过画图可以知道)长:可通过四个点中x判断算出;宽:可通过四个点中y判断算出;

 

代码实现:

class Solution {

public int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2){

int area1 =(ax2-ax1)*(ay2-ay1);

int area2=(bx2-bx1)*(by2-by1);

int overchang =Math.min(ax2,bx2)-Math.max(ax1,bx1);

int overkuan =Math.min(ay2,by2)-Math.max(ay1,by1);

int overarea=Math.max(overchang,0)*Math.max(overkuan,0);

int zongarea = area1+area2-overarea;

return zongarea;

    }

}

 

第二题:旅行终点站(回顾)

给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 cityBi 。

请你找出这次旅行的终点站,即没有任何可以通往其他城市的线路的城市。

题目数据保证线路图会形成一条不存在循环的线路,因此恰有一个旅行终点站。

示例 1:

输入:paths = [["London","New York"],["New York","Lima"],["Lima","Sao Paulo"]]
输出:"Sao Paulo"
解释:从 "London" 出发,最后抵达终点站 "Sao Paulo" 。本次旅行的路线是 "London" -> "New York" -> "Lima" -> "Sao Paulo" 。
示例 2:

输入:paths = [["B","C"],["D","B"],["C","A"]]
输出:"A"
解释:所有可能的线路是:
"D" -> "B" -> "C" -> "A". 
"B" -> "C" -> "A". 
"C" -> "A". 
"A". 
显然,旅行终点站是 "A" 。
示例 3:

输入:paths = [["A","Z"]]
输出:"Z"
 

提示:

1 <= paths.length <= 100
paths[i].length == 2
1 <= cityAi.length, cityBi.length <= 10
cityAi != cityBi
所有字符串均由大小写英文字母和空格字符组成。

 

思路:

1、首先明确要输出的为旅行的终点站是一个单元,且输入的是List<List<String>> paths一个集合组;

2、其次通过List来存储经历过的城市,即可通过判断最后一个地方是否与之前经过的城市相同,倘若不同则返回!

 

代码实现:

class Solution {
    public String destCity(List<List<String>> paths) {
        List <String> cityA = new ArrayList<String>();
        for(List<String> path: paths){
            cityA.add(path.get(0));
        }
        for(List<String> path:paths){
            if(!cityA.contains(path.get(1))){
                return path.get(1);
            }
        }
        return "";
    }
}
 
第三题:删除链表中的结点

请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。

题目数据保证需要删除的节点 不是末尾节点 。

 

示例 1:

 


输入:head = [4,5,1,9], node = 5
输出:[4,1,9]
解释:指定链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9
示例 2:


输入:head = [4,5,1,9], node = 1
输出:[4,5,9]
解释:指定链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9
示例 3:

输入:head = [1,2,3,4], node = 3

输出:[1,2,4]
示例 4:

输入:head = [0,1], node = 0
输出:[1]
示例 5:

输入:head = [-3,5,-99], node = -3
输出:[5,-99]
 

提示:

链表中节点的数目范围是 [2, 1000]
-1000 <= Node.val <= 1000
链表中每个节点的值都是唯一的
需要删除的节点 node 是 链表中的一个有效节点 ,且 不是末尾节点

思路:

1、明确输出的是删除结点后的链表

2、删除操作就是直接Node.next=Node.next.next;

3、一开始写没注意到值Val所以导致错误;得先明确哪一个结点的值指向这一结点的下一个结点的值!最后才能实现只访问该节点的删除操作

 

代码实现:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public void deleteNode(ListNode node) {
        node.val=node.next.val;
        node.next=node.next.next;
    }
}
posted on 2021-11-02 19:43  陈诺252  阅读(102)  评论(0)    收藏  举报