保研机试练习:leetcode算法top200(第二弹)

news2025/1/30 16:25:24

🌮101.对称二叉树(简单)

🍟题目描述

🍟题目反思

对称二叉树,对每个节点来说,就是当前节点相同,且左右镜像相等。这道题目重点也是在于掌握递归检查树上。

🍟代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool check(TreeNode *p, TreeNode *q) {
        if (p==nullptr && q==nullptr) return true;
        if (p==nullptr || q==nullptr) return false;
        return p->val == q->val && check(p->left, q->right) && check(p->right, q->left);//要求根相等且左右对称相等
    }
​
    bool isSymmetric(TreeNode* root) {
        return check(root, root);
    }
};

🌮104.二叉树的最大深度(简单)

🍟题目描述

🍟题目反思

这道题目也是使用递归的方法,主要是巩固一下递归的方法。

🍟代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root==nullptr) return 0;
        return max(maxDepth(root->left),maxDepth(root->right))+1;
    }
};

🌮108.将有序数组转换为二叉搜索树(简单)

🍟题目描述

🍟题目反思

这道题目也是使用递归的方法,但是有一定的思路在里边,建议顺一遍过程。

🍟代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return helper(nums, 0, nums.size() - 1);
    }//每次都选出根节点,左右两组分别递归一下
​
    TreeNode* helper(vector<int>& nums, int left, int right) {
        if (left > right) {
            return nullptr;
        }
​
        // 总是选择中间位置左边的数字作为根节点
        int mid = (left + right) / 2;
​
        TreeNode* root = new TreeNode(nums[mid]);
        root->left = helper(nums, left, mid - 1);
        root->right = helper(nums, mid + 1, right);
        return root;
    }
};

🌮112.路径总和(简单)

🍟题目描述

🍟题目反思

这道题目也是用的递归方法,建议顺一遍思路。

🍟代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool hasPathSum(TreeNode *root, int sum) {
        if (root == nullptr) {
            return false;
        }
        if (root->left == nullptr && root->right == nullptr) {
            return sum == root->val;
        }
        return hasPathSum(root->left, sum - root->val) ||
               hasPathSum(root->right, sum - root->val);
    }
};

🌮125.验证回文串(简单)

🍟题目描述

🍟题目反思

这道题目掌握几个函数:

  • isalnum(char):用于判断当前字符是否是字母或数字,如果是,返回true,不是返回false;
  • tolower(char):用于将大小写字母转换成小写字母,toupper(char)用于转换成大写字母;
  • reverse(s.begin(),s.end()):用于将字符串反转

🍟代码

class Solution {
public:
    bool isPalindrome(string s) {
        string ans;
        for (char ch: s) {
            if (isalnum(ch)) {
                ans += tolower(ch);
            }
        }
        string ss=ans;
        reverse(ss.begin(),ss.end());
        return ss==ans;
    }
};

🌮130.被围绕的区域(中等)

🍟题目描述

🍟题目反思

这道题目的思路是:

所有的不被包围的 O 都直接或间接与边界上的 O 相连。我们可以利用这个性质判断 O 是否在边界上,具体地说:

    对于每一个边界上的 O,我们以它为起点,标记所有与它直接或间接相连的字母 O;
    最后我们遍历这个矩阵,对于每一个字母:

  • 如果该字母被标记过,则该字母为没有被字母 X 包围的字母 O,我们将其还原为字母 O;
  • 如果该字母没有被标记过,则该字母为被字母 X 包围的字母 O,我们将其修改为字母 X。

利用了队列queue,和BFS的操作流程,每次将不能被变成X的O加入队列,然后依次判断其四周是否有同样不能被变成X的O。

🍟代码

class Solution {
public:
    const int dx[4] = {1, -1, 0, 0};
    const int dy[4] = {0, 0, 1, -1};
​
    void solve(vector<vector<char>>& board) {
        int n = board.size();//行数
        if (n == 0) {
            return;
        }
        int m = board[0].size();//列数
        queue<pair<int, int>> que;//队列,把所有的O放入
        //把四条最外边的行列的O记录下,这些都不能被去掉
        for (int i = 0; i < n; i++) {
            if (board[i][0] == 'O') {
                que.emplace(i, 0);//相当于que.push_back({i,0});存入的是x、y位置
                board[i][0] = 'A';
            }
            if (board[i][m - 1] == 'O') {
                que.emplace(i, m - 1);
                board[i][m - 1] = 'A';
            }
        }
        for (int i = 1; i < m - 1; i++) {
            if (board[0][i] == 'O') {
                que.emplace(0, i);
                board[0][i] = 'A';
            }
            if (board[n - 1][i] == 'O') {
                que.emplace(n - 1, i);
                board[n - 1][i] = 'A';
            }
        }
        //剩下的都有上下左右格子了
        while (!que.empty()) {
            int x = que.front().first, y = que.front().second;
            que.pop();
            for (int i = 0; i < 4; i++) {
                int mx = x + dx[i], my = y + dy[i];
                if (mx < 0 || my < 0 || mx >= n || my >= m || board[mx][my] != 'O') {
                    continue;
                }
                que.emplace(mx, my);//这里是O,且不能被去掉
                board[mx][my] = 'A';
            }
        }
        for (int i = 0; i < n; i++) {//遍历整个矩阵
            for (int j = 0; j < m; j++) {
                if (board[i][j] == 'A') {//这些都是不能被去掉的O
                    board[i][j] = 'O';
                } else if (board[i][j] == 'O') {//这些是能被去掉的O
                    board[i][j] = 'X';
                }
            }
        }
    }
};

🌮160.相交链表——双指针法(简单)

🍟题目描述

🍟题目反思

这道题目使用双指针的方法:

只有当链表 headA 和 headB 都不为空时,两个链表才可能相交。因此首先判断链表 headA 和 headB 是否为空,如果其中至少有一个链表为空,则两个链表一定不相交,返回 null。

当链表 headA 和 headB 都不为空时,创建两个指针 pA 和 pB,初始时分别指向两个链表的头节点 headA 和 headB,然后将两个指针依次遍历两个链表的每个节点。具体做法如下:

  • 每步操作需要同时更新指针 pA 和 pB。
  • 如果指针 pA 不为空,则将指针 pA 移到下一个节点;如果指针 pB 不为空,则将指针 pB 移到下一个节点。
  • 如果指针 pA 为空,则将指针 pA 移到链表 headB 的头节点;如果指针 pB 为空,则将指针 pB 移到链表 headA 的头节点。
  • 当指针 pA 和 pB 指向同一个节点或者都为空时,返回它们指向的节点或者 null。

🍟代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if (headA == nullptr || headB == nullptr) {
            return nullptr;
        }
        ListNode *pA = headA, *pB = headB;
        while (pA != pB) {
            pA = pA == nullptr ? headB : pA->next;//到头就转到另一条链表,否则就往后移
            pB = pB == nullptr ? headA : pB->next;
        }
        return pA;//如果二者相等就会返回相交节点,否则二者同到null就会返回null
    }
};

🌮168.Excel表列名称(简单)

🍟题目描述

🍟题目反思

理解清楚后就会发现,这道题目就是另类的进制转换,字母转数字的基数是26,类似十进制转二进制,每次对26取余。这里需要注意的一点是,A是1,所以每次要得到正确结果需要先减1.

🍟代码

class Solution {
public:
    string convertToTitle(int columnNumber) {
        string ans;
        int cur;
        while(columnNumber>0) {
            cur=(columnNumber-1)%26;
            ans+=cur+'A';
            columnNumber=(columnNumber-cur)/26;
        }
        reverse(ans.begin(),ans.end());
        return ans;
    }
};

🌮171.Excel表列序号(简单)

🍟题目描述

同理,上道题目翻过来

🍟题目反思

类似二进制转十进制

🍟代码

class Solution {
public:
    int titleToNumber(string columnTitle) {
        int len=columnTitle.size();
        if(len==1) return columnTitle[0]-'A'+1;
        long long ans=0;
        for(int i=0;i<len-1;i++)
        {
            ans+=(columnTitle[i]-'A'+1);
            ans*=26;
            //cout<<columnTitle[i]-'A'+1<<" "<<ans<<endl;//
        }
        ans+=(columnTitle[len-1]-'A'+1);
        //cout<<columnTitle[len-1]-'A'+1<<" "<<ans<<endl;//
        return ans;
    }
};

🌮190.颠倒二进制位(简单)

🍟题目描述

🍟题目反思

这道题目是二进制位的处理,主要是学会左移、右移等操作。

🍟代码

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        int i=32;
        uint32_t ans=0;
        while(i>0){
            ans<<=1;//左移一位,为当前处理位留出位置
            ans+=n&1;//取出最低位,并加入结果
            n>>=1;//n丢弃掉已经处理过的最低位
            i--;
        }
        return ans;
    }
};

🌮191.位1的个数(简单)

🍟题目描述

🍟题目反思

这道题目就是模拟十进制转二进制然后计算其中1的个数,注意记得反转。

🍟代码

class Solution {
public:
    int hammingWeight(int n) {
        string s;
        while(n>0) 
        {
            s+=n%2+'0';
            n/=2;
        }
        reverse(s.begin(),s.end());
        int ans=0;
        for(int i=0;i<s.size();i++) 
        {
            if(s[i]=='1') ans++;
        }
        return ans;
    }
};

⭐创作不易,点个赞吧~

⭐点赞收藏不迷路~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1977574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# 自定义控件无法加载

问题 在做winform开发时自己定义了一个控件&#xff0c;控件在工具箱中显示了&#xff0c;但是拖动到窗体设计器时会提示未能加载工具箱项xxx&#xff0c;将从工具箱中将其删除&#xff0c;如下图所示: 点击确定后&#xff0c;控件会从工具箱中移除。 解决方法 将 生成>…

深信服的云桌面操作简要

看了深信服的云桌面操作手册&#xff0c;讲真&#xff0c;我是没有耐心看的&#xff0c;656页&#xff0c;我是云桌面管理员&#xff0c;为了管理也必须耐着性子去看&#xff0c;但我看了40页就看不下去了&#xff0c;太啰嗦了。 深信服的技术人员安装好服务器后给我实际演示操…

【C++题解】1351. 买公园门票

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1351. 买公园门票 类型&#xff1a;简单穷举 题目描述&#xff1a; 某公园门票价格为&#xff1a;成人票 8 元 / 张&#xff0c;儿童票 3 元 / 张&#xff1b;某旅游团来公园游玩&…

Memcached未授权访问漏洞

Memcached未授权访问漏洞 Memcache能够提供临时数据存储服务&#xff0c;可以提高网站的整体性能&#xff0c;但由于memcache安全设计缺陷&#xff0c;默认开放的端口是11211&#xff0c;导致不需要密码就可以访问&#xff0c;攻击者可以直接连接服务器的11211端口获取数据库中…

GIt最新教程通俗易懂

Git学习笔记 一、Git版本控制分类1.1 本地版本控制1.2 集中版本1.3 分布式版本控制系统1.5 Git和SVN的区别二、Git的历史 三、Gti基础学习3.1 Git的基础学习3.2 启动Git 3.3 Git基本的配置3.3.1 配置文件相关位置 四、Git基本理论&#xff08;核心&#xff09;4.1 Git 的工作流…

vue echarts 柱状图和折线图的组合

柱状图和折线图的组合代码如下&#xff1a; <template><div><div id"barLineChart" ref"barLineChartRef" style"width: 100%; height: 450px"></div></div> </template><script> import * as echar…

【收录率高丨最快会后3-4个月EI检索 | 往届均已EI检索】第四届光学与通信技术国际学术会议(ICOCT 2024,8月9-11)

欢迎参加第四届光学与通信技术国际学术会议&#xff08;ICOCT 2024&#xff09;&#xff0c;该会议将于2024年8月9-11日在南京举办。自2021年首次会议以来&#xff0c;ICOCT已经发展成为光学和通信领域较有影响力的国际会议之一&#xff0c;聚焦最前沿的技术进展与未来发展趋势…

C/C++大雪纷飞代码(完整代码)

目录 写在前面 C语言简介 EasyX简介 大雪纷飞 运行结果 写在后面 写在前面 本期博主给大家带来了C/C++实现的大雪纷飞代码,一起来看看吧! 系列推荐 序号目录直达链接1爱心代码C/C++爱心代码(完整代码)_爱心代码编程c++语言-CSDN博客2李峋同款跳动的爱心C/C++李峋同…

详解高性能中间件Iceoryx在ROS2中的使用

文章目录 0. 概述1. 系统架构对比1.1 移除 Master 节点1.2 引入 DDS 系统1.3 跨平台支持 2. DDS 系统的引入2.1 RMW 概述2.2 QoS&#xff08;质量服务策略&#xff09; 3. ROS2安装与配置3.1 一键安装3.2 官网教程 4. [ROS2 底层切换 Iceoryx 官方实现](https://github.com/ros…

安全与效率并重:利用PowerShell脚本实现SQL Server网络配置的自动化监控与日志

目录 脚本概述 步骤实现 注意事项 创建一个PowerShell脚本&#xff0c;用于自动发现并记录SQL Server上所有连接的网络配置细节&#xff0c;包括端口、协议和安全性设置&#xff0c;是一个非常实用的操作&#xff0c;特别是在需要定期审计或新服务器部署时。以下是一个创意性…

【深度学习】【框架】【基本结构】transformer

论文地址:https://arxiv.org/pdf/1706.03762 1. 整体结构 2. 内部结构 3. 公式 Transformer工作原理四部曲:Embedding(向量化)、Attention(注意力机制)、MLPs(多层感知机)和Unembedding(模型输出)。

实体业短视频基础剪辑:拍摄剪辑实用10大技巧+剪辑全集(29节)

课程目录 01.第一节|找对标.mp4 02.第二节|快速提取对标音乐.mp4 03.第三节|踩节拍.mp4 04.第四节|导入镜头.mp4 05.第五节|调节比例.mp4 06.第六节|变速.mp4 07.第七节|添加字幕.mp4 08.第一节|推镜头.mp4 09.第二节|拉镜头.mp4 10.第三节|下摇镜头.mp4 11.第四节|…

跟李沐学AI:AlexNet、VGG

目录 AlexNet架构 AlexNet总结 AlexNet实现 VGG块 VGG架构 VGG总结 AlexNet架构 输入图片为3x224x224维度&#xff1b;第一个卷积层核窗口大小为11x11&#xff0c;卷积层输出为96通道&#xff0c;步长为4&#xff1b;第一个最大池化层窗口大小为3x3&#xff0c;步长为2。…

C语言项目实战FTP文件传输(windows网络编程基础)

文章目录 前言一、客户端和服务端介绍二、客户端和服务器之间进行通信的过程客户端和服务器建立通信的流程通信过程的示例图流程说明 三、客户端代码编写代码解释 四、服务端代码编写代码解释 总结 前言 本篇文章开始将带大家来学习FTP文件传输助手的项目实现&#xff0c;这个…

【51单片机仿真】基于51单片机设计的温湿度采集检测系统仿真源码文档视频——文末资料下载

演示 目录 1.系统功能 2.背景介绍 3.硬件电路设计 4.软件设计 4.1 主程序设计 4.2 温湿度采集模块程序设计 4.3 LCD显示屏程序设计 5.系统测试 6.结束语 源码、仿真、文档视频等资料下载链接 1.系统功能 该系统通过与AT89C51单片机、LCD1602显示屏和DHT11温湿度传感器…

makefile(1)

文章目录 概述简单Makefilemakefile三要素makefile&#xff1a;工作原理编译程序 小结 概述 makefile这个编译在c中很常见&#xff0c;看下操作系统&#xff0c;都是基于makefile编译的。来简单看下&#xff0c; 这个就不看了&#xff0c;每一个模块下都有一个对应的makefile…

前端:javaScript基础知识

一、输出语句 ①window.alert()&#xff1a;弹出框 ②ducument.write()&#xff1a;写入HTML输入 ③console.log()&#xff1a;在浏览器控制台输出 二、声明变量 ①使用关键字var来声明变量 ②javaScript是一门弱类型语言&#xff0c;变量可以存放不同类型的值 ③变量需要遵…

【Python】字符串练习题及代码示例

1、使用while循环实现对字符串中每个字符进行输出。 代码示例&#xff1a; 2、请将代码实现如下进制的转换。 &#xff08;1&#xff09;v1675,请将v1转换为二进制。 代码&#xff1a; 注意&#xff1a;将十进制数转换为二进制数的方法是&#xff1a;bin(a),a是整型&#x…

使用 addRouteMiddleware 动态添加中间

title: 使用 addRouteMiddleware 动态添加中间 date: 2024/8/4 updated: 2024/8/4 author: cmdragon excerpt: 摘要&#xff1a;文章介绍了Nuxt3中addRouteMiddleware的使用方法&#xff0c;该功能允许开发者动态添加路由中间件&#xff0c;以实现诸如权限检查、动态重定向及…

html+css 实现hover双层按钮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 文…