[杨小白]_leetcode_中国银联专场竞赛-第一、二题

303 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!

中国银联专场竞赛(2023届校园招聘专场)

中国银联专场竞赛(2023届校园招聘专场)-力扣

这个比赛当时没看到,参加的人不多,后来自己做发现并不难,四题都能a了,咱就分三期讲讲这四个题啦。

银联-1. 重构链表

给定一个链表的头节点 head ,在不改变节点顺序的基础下,请删除链表中所有值为 偶数 的节点,并返回这个链表 。

注意:

  • 若链表为空,则返回空值。

示例 1

输入:head = [1,4,3,6]

输出:[1,3]

解释:如下图所示,黑色节点的值均为偶数,删除这些节点后,链表为 [1,3]

image.png

示例 2

输入:head = [5,7,9,9,1]

输出:[5,7,9,9,1]

解释:原链表中不存在值为偶数的节点。

示例 3

输入:head = [2,4]

输出:[]

解释:原链表中所有节点值均为偶数。

提示

1 <= head.length <= 10^5
0 <= Node.val <= 100

代码

这题是真的简单,出的没任何意义。。。。

class Solution {
    public ListNode reContruct(ListNode head) {
        ListNode root = new ListNode(0);
        ListNode cur = root;
        while(head!=null) {
            if(head.val % 2!=0) {
                cur.next = head;
                cur = cur.next;
            }
            head = head.next;
        }
        cur.next = null;
        return root.next;
    }
}

image.png

银联-2. 勘探补给

工程部在一条坐标轴上设立了若干补给站,station[i] 表示编号为 i 的补给站的坐标。

现在有一些正在执行任务的勘探队需要进行补给,pos[i] 表示第 i 个勘探队当前所在位置的坐标。勘探队将优先选择当前距离最近的补给站进行补给。若两座补给站距离相同,则选择坐标更小的那一个。

请按顺序返回这些勘探队所选择的补给站编号。

注意:

  • station 中的元素严格递增,即 station[i] < station[i+1]

示例 1

输入:
station = [2,7,8,10]
pos = [4,9]
输出:
[0,2]
解释:
坐标 4 的勘探队与坐标为 2 和 7 的补给站距离分别为 2 和 3, 选择坐标为 2的补给站
坐标 9 的勘探队与坐标为 8 和 10 的补给站的距离均为 1, 选择坐标更小为 8 的补给站
返回编号为 [0,2] 的补给站。

示例 2

输入:
station = [2,5,8,14,17]
pos = [1,14,11,2]
输出:
[0,3,2,0]

提示

  • 1 <= pos.length,station.length <= 10^4
  • 1 <= pos[i] <= 10^6
  • 1 <= station[i] < station[i+1] <= 10^6

代码

第二题基本也没什么难度,一眼二分,复杂度O(nlogn)。暴力应该也可以做,盲猜不会超时,毕竟才第二题。

二分主要的是在什么时候停止,和开区间闭区间的问题,要不然很容易报超数组的异常。

class Solution {
    public int[] explorationSupply(int[] station, int[] pos) {
        int[] res = new int[pos.length];
        for (int i = 0; i < res.length; i++) {
            res[i] = finde(station, pos[i]);
        }
        return res;
    }

    public int finde(int[] station, int target) {
        int left = 0;
        int right = station.length - 1;
        while (true) {
            if (right - left <= 1) {
                int t1 = Math.abs(station[right] - target) ;
                int t2 = Math.abs(station[left] - target) ;
                if (t1 < t2) {
                    return right;
                }else {
                    return left;
                }
            }
            int mid = left + (right - left) / 2;
            if (station[mid] <= target) {
                left = mid;
            } else {
                right = mid;
            }
        }
    }
}

看了一眼时间很长的代码,就是用暴力做的,所以也不会超时了。

image.png

第三题连接如下-银联-3. 风能发电

银联-3. 风能发电

第四题连接如下-银联-4. 设计自动售货机

银联-4. 设计自动售货机

3.结束

前两题都不难,基本100题量的同学就可以做出来了,后面两个题也没什么高深的算法所以这场还算能ak了,gogogo,刷题刷题,每天一道,三年1000道!!!!