「天池 X LeetCode」在线编程专场选拔赛题解

217 阅读1分钟

01. 统计链表奇数节点

给你一个链表的头节点 head,请统计链表中值为 奇数 的节点个数

示例 1:

输入: head = [2,1,8]
输出: 1
解释: 链表中存在 1 个奇数值的节点,值为 1

示例 2:

输入:head = [1,2,3,4]
输出:2
解释:链表中存在 2 个奇数值的节点,值分别为 1、3

提示:

  • 链表中节点的数目在 [1, 5000] 范围内。
  • 1 <= Node.val <= 10000
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    int numberEvenListNode(ListNode* head) {
        int res = 0;
        while(head!= NULL){
            if(head->val%2){
                res++;
            }
            head = head->next;
        }
        return res;
    }
};

02. 光线反射

工程师正在研究一个 N*M 大小的光线反射装置,装置内部的构造记录于 grid 中,其中

  • '.' 表示空白区域,不改变光的传播方向
  • 'R' 表示向右倾斜的 双面 均可反射光线的镜子,改变光的传播方向
  • 'L' 表示向左倾斜的 双面 均可反射光线的镜子,改变光的传播方向

假如光线从装置的左上方垂直向下进入装置,请问在离开装置前,光线在装置内部经过多长的路线。

 

示例 1:

输入:grid = ["...","L.L","RR.","L.R"]
输出:12
解释:如图所示,光线经过路线长度为 12

示例 2:

输入:grid = ["R.",".."]
输出:1
解释:如图所示,光线经过路线长度为 1

提示:

  • 1 <= grid.length, grid[i].length <= 100
  • grid[i][j] 仅为 'L'、'R' 和 '.'

题解:模拟

class Solution {
public:
    int getLength(vector<string>& g) {
        int res = 0;
        int n = g.size(), m = g[0].size();
        int i=0, j = 0, d = 2;
        while(i >=0 && i < n && j >=0 && j < m){
            res++;
            if(g[i][j] == '.'){
                if(d == 1){
                    j++;
                }else if(d == 2){
                    i++;
                }else if(d == 3){
                    j--;
                }else{
                    i--;
                }
            }else if(g[i][j] == 'L'){
                if(d == 1){
                    d = 2;
                    i++;
                }else if(d == 2){
                    d = 1;
                    j++;
                }else if(d == 3){
                    d = 4;
                    i--;
                }else{
                    d = 3;
                    j--;
                }
            }else{
                if(d == 1){
                    d = 4;
                    i--;
                }else if(d == 2){
                    d = 3;
                    j--;
                }else if(d == 3){
                    d = 2;
                    i++;
                }else{
                    d = 1;
                    j++;
                }
            }
        }
        return res;
    }
};

也可以参考灵神有很巧妙的方式来做。

03. 整理书架

书架上有若干本书,从左至右的书籍编号记于整型数组 order 中。为保证书籍多样性,管理员想取走一些重复编号的书籍,要求满足以下条件:

  • 剩余书本中相同编号的书本数量均不大于 limit
  • 取走的书籍数量尽可能少

由于存在多种整理方案,请返回剩余书本编号的排列为「最小排列」的方案。

注意:

  • 「最小排列」:若干数组中第一位数字最小的数组;若第一位数字相同,则为第二位数字最小的数组,以此类推。

示例 1:

输入:order = [5,5,6,5], limit = 2
输出:[5,5,6]
解释:order 中出现了 35 号书:
方案 1:去掉 order[0]order[1],所得排列为 [5,6,5];
方案 2:去掉 order[3],所得排列为 [5,5,6];
经比较,最终返回排列最小的方案 2[5,5,6]

示例 2:

输入:order = [5,5,6,5], limit = 3
输出:[5,5,6,5]
解释:order 中所有相同编号的书本数目均未超过 limit,不需要去除,返回 [5,5,6,5]

示例 3:

输入:order = [3,3,9,8,9,2,8], limit = 1
输出:[3,8,9,2]
解释:列表中 389 号数字都出现了 2 次,去掉编号相同的书后的排列结果中 [3,8,9,2] 为排列最小的结果。

示例 4:

输入:order = [2,1,2,2,1,3,3,1,3,3], limit = 2
输出:[1,2,2,1,3,3]

提示:

  • 1 <= order.length <= 10^5
  • 1 <= limit <= 10
  • 1 <= order[i] <= 10^6

题解: 单调栈

class Solution {
public:
    vector<int> arrangeBookshelf(vector<int>& order, int limit) {
        map<int, int> hash;
        map<int, int> stk_hash;
        for(auto c : order){
            hash[c]++;
        }
        stack<int> stk;
        for(auto c : order){
            if(stk_hash[c] == limit){
                hash[c]--;
                continue;
            }
            while(!stk.empty() && c < stk.top() && hash[stk.top()] > limit){
                hash[stk.top()]--;
                stk_hash[stk.top()]--;
                stk.pop();
            }
            stk_hash[c]++;
            stk.push(c);
        }
        vector<int> res;
        while(stk.size()){
            res.push_back(stk.top());
            stk.pop();
        }
        reverse(res.begin(), res.end());
        return res;
    }
};