Leetcode刷题——模拟题汇总

371 阅读2分钟

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

模拟

838. 推多米诺

题目 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立。在开始时,同时把一些多米诺骨牌向左或向右推。

每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。

如果一张垂直竖立的多米诺骨牌的两侧同时有多米诺骨牌倒下时,由于受力平衡, 该骨牌仍然保持不变。

就这个问题而言,我们会认为一张正在倒下的多米诺骨牌不会对其它正在倒下或已经倒下的多米诺骨牌施加额外的力。

给你一个字符串 dominoes 表示这一行多米诺骨牌的初始状态,其中:

dominoes[i] = 'L',表示第 i 张多米诺骨牌被推向左侧, dominoes[i] = 'R',表示第 i 张多米诺骨牌被推向右侧, dominoes[i] = '.',表示没有推动第 i 张多米诺骨牌。 返回表示最终状态的字符串。

示例 1:

输入:dominoes = "RR.L" 输出:"RR.L" 解释:第一张多米诺骨牌没有给第二张施加额外的力。

示例 2: 在这里插入图片描述

输入:dominoes = ".L.R...LR..L.." 输出:"LL.RR.LLRRLL.."

提示:

n == dominoes.length 1 <= n <= 105 dominoes[i] 为 'L'、'R' 或 '.'

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/pu… 代码

char * pushDominoes(char * dominoes){
    int left='L';
    int i=0, n=strlen(dominoes);
    while(i < n){
        int j=i; 
        while(j < n && dominoes[j]=='.'){
            j++;
        }
        char right = j < n ?dominoes[j]:'R';
        if(left==right){
            while (i < j) {
                dominoes[i++] = right;
            }
        }else if(left=='R' && right=='L'){
            int k=j-1;
            while(i < k){
                dominoes[i++]='R';
                dominoes[k--]='L';
            }
        }
        left = right;
        i=j+1;
    }
    return dominoes;
}

1380. 矩阵中的幸运数

题目 给你一个 m * n 的矩阵,矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。

幸运数是指矩阵中满足同时下列两个条件的元素:

在同一行的所有元素中最小 在同一列的所有元素中最大

示例 1:

输入:matrix = [[3,7,8],[9,11,13],[15,16,17]] 输出:[15] 解释:15 是唯一的幸运数,因为它是其所在行中的最小值,也是所在列中的最大值。

示例 2:

输入:matrix = [[1,10,4,2],[9,3,8,7],[15,16,17,12]] 输出:[12] 解释:12是唯一的幸运数,因为它是其所在行中的最小值,也是所在列中的最大值。

示例 3:

输入:matrix = [[7,8],[1,2]] 输出:[7]

提示:

m == mat.length n == mat[i].length 1 <= n, m <= 50 1 <= matrix[i][j]<= 10^5 矩阵中的所有元素都是不同的 通过次数22,121提交次数29,563

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/lu…

代码

打表,按照题目要求模拟即可

class Solution {
public:
    vector<int> luckyNumbers (vector<vector<int>>& matrix) {
        int m=matrix.size(), n=matrix[0].size();
        int row[m], col[n];
        for(int i=0; i < m; i++){
            row[i] = 0x5fffffff;
        }
        for(int i=0; i < n; i++){
            col[i] = 0;
        }
        for(int i=0; i < m; i++){
            for(int j=0; j < n; j++){
                row[i] = min(row[i], matrix[i][j]);
                col[j] = max(col[j], matrix[i][j]);
            }
        }
        vector<int> ans;
        for(int i=0; i < m; i++){
            for(int j=0; j < n; j++){
                if(matrix[i][j] == row[i] && row[i] == col[j]){
                    ans.push_back(matrix[i][j]);
                }
            }
        }
        return ans;
    }
};

1688. 比赛中的配对次数

题目 给你一个整数 n ,表示比赛中的队伍数。比赛遵循一种独特的赛制:

如果当前队伍数是 偶数 ,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,且产生 n / 2 支队伍进入下一轮。 如果当前队伍数为 奇数 ,那么将会随机轮空并晋级一支队伍,其余的队伍配对。总共进行 (n - 1) / 2 场比赛,且产生 (n - 1) / 2 + 1 支队伍进入下一轮。 返回在比赛中进行的配对次数,直到决出获胜队伍为止。

示例 1:

输入:n = 7
输出:6
解释:比赛详情:
- 第 1 轮:队伍数 = 7 ,配对次数 = 3 ,4 支队伍晋级。
- 第 2 轮:队伍数 = 4 ,配对次数 = 2 ,2 支队伍晋级。
- 第 3 轮:队伍数 = 2 ,配对次数 = 1 ,决出 1 支获胜队伍。
总配对次数 = 3 + 2 + 1 = 6

示例 2:

输入:n = 14
输出:13
解释:比赛详情:
- 第 1 轮:队伍数 = 14 ,配对次数 = 7 ,7 支队伍晋级。
- 第 2 轮:队伍数 = 7 ,配对次数 = 3 ,4 支队伍晋级。 
- 第 3 轮:队伍数 = 4 ,配对次数 = 2 ,2 支队伍晋级。
- 第 4 轮:队伍数 = 2 ,配对次数 = 1 ,决出 1 支获胜队伍。
总配对次数 = 7 + 3 + 2 + 1 = 13

提示:

1 <= n <= 200

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/co…

代码

class Solution {
public:
    int numberOfMatches(int n) {
        int cnt=0;
        while(n > 1){
            cnt += n / 2;
            n = n / 2 + n % 2;
        }
        return cnt;
    }
};