做题记录——模拟

1.lc2042:检查句子中的数字是否递增(2023/1/3)

题目:

句子是由若干 token 组成的一个列表,token 间用 单个 空格分隔,句子没有前导或尾随空格。每个 token 要么是一个由数字 0-9 组成的不含前导零的 正整数 ,要么是一个由小写英文字母组成的 单词 。

  • 示例,"a puppy has 2 eyes 4 legs" 是一个由 7 个 token 组成的句子:"2" 和 "4" 是数字,其他像 "puppy" 这样的 tokens 属于单词。

给你一个表示句子的字符串 s ,你需要检查 s 中的 全部 数字是否从左到右严格递增(即,除了最后一个数字,s 中的 每个 数字都严格小于它 右侧 的数字)。

如果满足题目要求,返回 true ,否则,返回 false 。

示例 :

输入:s = "1 box has 3 blue 4 red 6 green and 12 yellow marbles"
输出:true
解释:句子中的数字是:1, 3, 4, 6, 12 。
这些数字是按从左到右严格递增的 1 < 3 < 4 < 6 < 12 。

思路:遍历字符串,遇到数字字符则将其转换为数字cur,并用pre记录上一个数字,若cur > pre则继续,否则返回false。遍历结束后,若句子末尾是数字,则返回cur > pre的结果,否则返回true。

代码

class Solution {
public:
    bool areNumbersAscending(string s) {
        int pre = INT_MIN, cur = 0, len = s.length();
        for (int i = 0; i < len; i++) {
            if (s[i] >= '0' && s[i] <= '9'){
                cur = cur * 10 + s[i] - '0';
            } else if (s[i] == ' ') {
                if (cur != 0) {
                    if (cur <= pre) {
                        return false;
                    }
                    pre = cur;
                    cur = 0;
                }
            }
        } 
        if (cur != 0) {
            if (cur <= pre) {
                return false;
            }
        }
        return true;       
    }
};

2.lc 2373:矩阵中的局部最大值(2023/3/1)

题目

给你一个大小为 n x n 的整数矩阵 grid 。

生成一个大小为 (n - 2) x (n - 2) 的整数矩阵  maxLocal ,并满足:

  • maxLocal[i][j] 等于 grid 中以 i + 1 行和 j + 1 列为中心的 3 x 3 矩阵中的 最大值 。

换句话说,我们希望找出 grid 中每个 3 x 3 矩阵中的最大值。

返回生成的矩阵。

示例 :

输入:grid = [[9,9,8,1],[5,6,2,6],[8,2,6,4],[6,2,2,2]]
输出:[[9,9],[8,6]]
解释:原矩阵和生成的矩阵如上图所示。
注意,生成的矩阵中,每个值都对应 grid 中一个相接的 3 x 3 矩阵的最大值。

思路:遍历每一个中心,依次求出该3x3矩阵中的最大值。

代码

class Solution {
public:
    vector<vector<int>> largestLocal(vector<vector<int>>& grid) {
        vector<vector<int>> ans;
        int maxn;
        int n = grid.size();
        for(int i = 1; i < n - 1; i++){
            vector<int> tmp;
            for(int j = 1; j < n - 1; j++){
                maxn = 0;
                for(int m = i - 1; m <= i + 1; m++){
                    for(int n = j - 1; n <= j + 1; n++){
                        maxn = max(maxn, grid[m][n]);
                    }
                }
                tmp.push_back(maxn);
            }
            ans.push_back(tmp);
        }
        return ans;
    }
};

3.lc面试题05.02:二进制数转字符串(2023/3/2)

题目

二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。

示例:

 输入:0.625
 输出:"0.101"

思路:将数字乘2,取整数部分当二进制的高位,小数部分继续执行该操作,直至小数部分为0,返回二进制字符串。若字符串长度超过32,则返回"ERROR"。

代码

class Solution {
public:
    string printBin(double num) {
        string ans = "0.";
        int integer;
        for(int i = 2; i < 32; i++){
            num *= 2;
            integer = num / 1;
            ans += integer + '0';
            num = num - integer;
            if(num == 0) return ans;
        }
        return "ERROR";
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值