力扣题目训练(17)

2024年2月10日力扣题目训练

  • 2024年2月10日力扣题目训练
    • 551. 学生出勤记录 I
    • 557. 反转字符串中的单词 III
    • 559. N 叉树的最大深度
    • 241. 为运算表达式设计优先级
    • 260. 只出现一次的数字 III
    • 126. 单词接龙 II

2024年2月10日力扣题目训练

2024年2月10日第十七天编程训练,今天主要是进行一些题训练,包括简单题3道、中等题2道和困难题1道。惰性太强现在才完成,不过之后我会认真完成的。

551. 学生出勤记录 I

链接: 出勤记录
难度: 简单
题目:
题目描述

运行示例:
运行示例

思路:
这道题就是一个简单的遍历,只需在遍历时判断是否不符合条件的情况即可。
代码:

class Solution {
public:
    bool checkRecord(string s) {
        int re1 = 0;
        int re2 = 0;
        for(int i = 0; i < s.size(); i++){
            if(s[i] == 'A'){
                re1++;
                re2 = 0;
                if(re1 == 2) return false;
            }else if(s[i] == 'L'){
                re2++;
                if(re2 == 3) return false;
            }else{
                re2 = 0;
            }
        }
        return true;
    }
};

557. 反转字符串中的单词 III

链接: 反转字符串中的单词
难度: 简单
题目:
题目描述

运行示例:
运行示例

思路:
这道题主要是遍历找到空格,根据空格将单词进行反转。
代码:

class Solution {
public:
    string reverseWords(string s) {
        int left = 0;
        string ans;
        for(int i = 0; i < s.size(); i++){
            if(s[i] == ' '){
                string tmp = s.substr(left,i-left);
                cout<<"asdf:"<<tmp<<endl;
                reverse(tmp.begin(),tmp.end());
                ans += tmp;
                ans += ' ';
                left = i+1;
            }
        }
        if(left != s.size()){
            string tmp = s.substr(left,s.size()-left);
            reverse(tmp.begin(),tmp.end());
            ans += tmp;
        }
        return ans;
    }
};

559. N 叉树的最大深度

链接: N 叉树的最大深度
难度: 简单
题目:
题目描述

运行示例:
运行示例

思路:
这道题求N叉树的深度,与543. 二叉树的直径类似,只是从二叉树拓展到N叉树而已。大家也可以先写一下104. 二叉树的最大深度添加链接描述和543. 二叉树的直径进行锻炼之后再写这道题。
代码:

class Solution {
public:
    int maxDepth(Node* root) {
        if(root == NULL) return 0;
        int maxChildDepth = 0;
        vector<Node*> children = root->children;
        for(int i = 0; i < children.size(); i++){
            int childrenDepth = maxDepth(children[i]);
            maxChildDepth = max(maxChildDepth,childrenDepth);
        }
        return maxChildDepth+1;
    }
};

241. 为运算表达式设计优先级

链接: 优先级
难度: 中等
题目:
题目描述

运行示例:
运行示例

思路:
这道题核心就是分治,利用运算符进行分割,递归求解结果。遍历字符串,每次遇到运算符时,将字符串分为运算符左侧和运算符右侧两部分,递归求解这两部分的结果。此外为避免重复计算我们可以利用一个哈希表记录已经计算过的部分。
代码:

class Solution {
public:
    unordered_map<string,vector<int>> memo;
    vector<int> findsome(string s){
        if(memo.find(s) != memo.end()) return memo[s];
        vector<int> ans;
        for(int i = 0; i <s.size(); i++){
            if(!isdigit(s[i])){
                vector<int> ans1 = findsome(s.substr(0,i));
                vector<int> ans2 = findsome(s.substr(i+1));
                if(s[i] == '+'){
                    for(auto& x: ans1)
                        for(auto& y: ans2) ans.push_back(x+y);
                }else if(s[i] == '-')
                    for(auto& x: ans1)
                        for(auto& y: ans2) ans.push_back(x - y);
                
                else
                    for(auto& x: ans1)
                        for(auto& y: ans2) ans.push_back(x * y);
            }
        }
        if(ans.empty()) ans.push_back(stoi(s));
        memo[s] = ans;
        return ans;
    }
    vector<int> diffWaysToCompute(string expression) {
        return findsome(expression);
    }
};

260. 只出现一次的数字 III

链接: 只出现一次的数字
难度: 中等
题目:
题目描述

运行示例:
运行示例

思路:
这道题考虑位运算,我们知道异或运算有以下性质:
任何数和 0做异或运算,结果仍然是原来的数,即 x⊕0=x;
任何数和其自身做异或运算,结果是 0,即 x⊕x=0;

根据这条性质,我们将数组中的所有数字进行异或运算,得到的结果即为两个只出现一次的数字的异或结果。但由于这两个数字不相等,因此异或结果中至少存在一位为 1。我们可以通过 lowbit 运算找到异或结果中最低位的 1,并将数组中的所有数字按照该位是否为 1分为两组,这样两个只出现一次的数字就被分到了不同的组中。 从而得到结果。

代码:

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        long long sum = 0;
        for(auto& num:nums) sum ^= num;
        int lsb = sum &(-sum);
        int a = 0,b = 0;
        for (auto& num: nums) {
            if (num & lsb) {
                a ^= num;
            }
            else {
                b ^= num;
            }
        }
        return {a,b};
    }
};

126. 单词接龙 II

链接: 单词接龙
难度: 困难
题目:
题目描述

运行示例:
运行示例

思路:
这道题我知道是应该用递归和回溯,但是不知道如何动笔。官方是利用广度优先搜索 + 回溯,建立图。
本题要求的是最短转换序列,看到最短首先想到的就是广度优先搜索。但是本题没有给出显示的图结构,根据单词转换规则:把每个单词都抽象为一个顶点,如果两个单词可以只改变一个字母进行转换,那么说明它们之间有一条双向边。因此我们只需要把满足转换条件的点相连,就形成了一张图。根据示例 1 中的输入,我们可以建出下图:

在这里插入图片描述
基于该图,我们以 “hit"为图的起点, 以 “cog"为终点进行广度优先搜索,寻找 “hit"到 “cog"的最短路径。下图即为答案中的一条路径。
在这里插入图片描述
由于要求输出所有的最短路径,因此我们需要记录遍历路径,然后通过回溯得到所有的最短路径。

细节

  • 从一个单词出发,修改每一位字符,将它修改成为 ‘a’到 ‘z’中的所有字符,看看修改以后是不是在题目中给出的单词列表中;
  • 有一些边的关系,由于不是最短路径上的边,不可以被记录下来。为此,我们为扩展出的单词记录附加的属性:层数。即下面代码中的steps。如果当前的单词扩散出去得到的单词的层数在以前出现过,则不应该记录这样的边的关系。

代码:

class Solution {
public:
    vector<vector<string>> findLadders(string beginWord, string endWord, vector<string> &wordList) {
        vector<vector<string>> res;
        // 因为需要快速判断扩展出的单词是否在 wordList 里,因此需要将 wordList 存入哈希表,这里命名为「字典」
        unordered_set<string> dict = {wordList.begin(), wordList.end()};
        // 修改以后看一下,如果根本就不在 dict 里面,跳过
        if (dict.find(endWord) == dict.end()) {
            return res;
        }
        // 特殊用例处理
        dict.erase(beginWord);

        // 第 1 步:广度优先搜索建图
        // 记录扩展出的单词是在第几次扩展的时候得到的,key:单词,value:在广度优先搜索的第几层
        unordered_map<string, int> steps = {{beginWord, 0}};
        // 记录了单词是从哪些单词扩展而来,key:单词,value:单词列表,这些单词可以变换到 key ,它们是一对多关系
        unordered_map<string, set<string>> from = {{beginWord, {}}};
        int step = 0;
        bool found = false;
        queue<string> q = queue<string>{{beginWord}};
        int wordLen = beginWord.length();
        while (!q.empty()) {
            step++;
            int size = q.size();
            for (int i = 0; i < size; i++) {
                const string currWord = move(q.front());
                string nextWord = currWord;
                q.pop();
                // 将每一位替换成 26 个小写英文字母
                for (int j = 0; j < wordLen; ++j) {
                    const char origin = nextWord[j];
                    for (char c = 'a'; c <= 'z'; ++c) {
                        nextWord[j] = c;
                        if (steps[nextWord] == step) {
                            from[nextWord].insert(currWord);
                        }
                        if (dict.find(nextWord) == dict.end()) {
                            continue;
                        }
                        // 如果从一个单词扩展出来的单词以前遍历过,距离一定更远,为了避免搜索到已经遍历到,且距离更远的单词,需要将它从 dict 中删除
                        dict.erase(nextWord);
                        // 这一层扩展出的单词进入队列
                        q.push(nextWord);
                        // 记录 nextWord 从 currWord 而来
                        from[nextWord].insert(currWord);
                        // 记录 nextWord 的 step
                        steps[nextWord] = step;
                        if (nextWord == endWord) {
                            found = true;
                        }
                    }
                    nextWord[j] = origin;
                }
            }
            if (found) {
                break;
            }
        }
        // 第 2 步:回溯找到所有解,从 endWord 恢复到 beginWord ,所以每次尝试操作 path 列表的头部
        if (found) {
            vector<string> Path = {endWord};
            backtrack(res, endWord, from, Path);
        }
        return res;
    }

    void backtrack(vector<vector<string>> &res, const string &Node, unordered_map<string, set<string>> &from,
             vector<string> &path) {
        if (from[Node].empty()) {
            res.push_back({path.rbegin(), path.rend()});
            return;
        }
        for (const string &Parent: from[Node]) {
            path.push_back(Parent);
            backtrack(res, Parent, from, path);
            path.pop_back();
        }
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无人机数据链技术,无人机数据链路系统技术详解,无人机数传技术

早期的无人机更多的为军事应用服务&#xff0c;如军事任务侦查等&#xff0c;随着技术和社会的发展&#xff0c;工业级无人机和民用无人机得到快速的发展&#xff0c;工业级无人机用于农业植保、地理测绘、电力巡检、救灾援助等&#xff1b;民用无人机用于航拍、物流等等领域。…

Codeforces Round 928 (Div. 4)(A、B、C、D、E、G)

文章目录 ABCDEG A 统计A、B输出 #include <bits/stdc.h> #define int long long #define rep(i,a,b) for(int i (a); i < (b); i) #define fep(i,a,b) for(int i (a); i > (b); --i) #define pii pair<int, int> #define ll long long #define db doubl…

springboot+flowable 使用方式

创建flowble制定流程图 登录flowalbe 制定流程图 进入建模器应用程序 创建流程图 分配用户 下载流程图 使用springboot 调用flowable /*** 导入流程图老师流程*/Testvoid startTeacherApprover(){Deployment deploy repositoryService.createDeployment().addClasspathRes…

2024,“热辣滚烫”的春节热点!

2024春节&#xff0c;都发生了哪些热点事件&#xff1f; 搜肠刮肚比较难&#xff0c;于是百度了一下&#xff0c;但结果难以令人满意&#xff0c;不同博主的眼中都有不同的热点。 这才想起&#xff0c;我们早已生活在自己的“信息茧房”中&#xff0c;每个人都有自己关注的热…

GZ036 区块链技术应用赛项赛题第9套

2023年全国职业院校技能大赛 高职组 “区块链技术应用” 赛项赛卷&#xff08;9卷&#xff09; 任 务 书 参赛队编号&#xff1a; 背景描述 随着异地务工人员的增多&#xff0c;房屋租赁成为一个广阔是市场&#xff1b;目前&#xff0c;现有技术中的房屋租赁是由…

天拓四方:如何通过工业智能网关进行设备数据采集,以及其带来的优势

工业智能网关是一种嵌入式设备&#xff0c;设计用于连接和管理各种工业设备和系统。它充当设备间的通信中介&#xff0c;实现数据采集、转换和传输。与传统的网关相比&#xff0c;工业智能网关具有更强的数据处理能力和更广泛的连接性&#xff0c;可以支持多种通信协议。在当今…

Unity MVC开发模式与开发流程详解

在Unity游戏开发中&#xff0c;采用MVC&#xff08;Model-View-Controller&#xff09;模式是一种非常常见的设计模式。MVC模式将应用程序分为三个部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#x…

数论 - 容斥原理

文章目录 一、题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 二、算法思路三、代码 在计数时&#xff0c;必须注意没有重复&#xff0c;没有遗漏。为了使重叠部分不被重复计算&#xff0c;人们研究出一种新的计数方法&#xff0c;这种方法的基本思…

VSCODE使用Django

https://code.visualstudio.com/docs/python/tutorial-django#_use-a-template-to-render-a-page 通过模板渲染页面 HTML文件 实现步骤 1&#xff0c; 修改代码&#xff0c;hello的App名字增加到installed_apps表中。 2&#xff0c; hello子目录下&#xff0c;创建 .\templat…

【无刷电机学习】基础概念及原理入门介绍

目录 0 参考出处 1 定义 2 各种电机优势比较 2.1 有刷与无刷比较 2.2 交流与直流比较 2.3 内转子与外转子比较 2.4 低压BLDC的一些优点 3 基本原理 3.1 单相无刷电机 3.2 三相无刷电机 4 驱动方法 4.1 六步换相控制 4.2 正弦波控制 5 转子位置信息的获取 5…

苍穹外卖学习-----2024/02/19

1.开发环境搭建 我的git截图我使用的datagrip 运行sql学习到jwt令牌一种新的配置方式&#xff0c;写配置文件学习到了build属性nginx解决跨域的问题2.导入接口的文档 结果如图所示 3.Swagger /*** 通过knife4j生成接口文档* return*/Beanpublic Docket docket() {ApiInfo api…

leetcode hot 100最后一块石头重量Ⅱ

在本题中&#xff0c;我们可以知道&#xff0c;是要求最后石头返还的重量&#xff0c;也就是&#xff0c;将整个数组分割成两个子集&#xff0c;求让两个子集的差值最小。这和上一道分割整数集类似&#xff0c;只是需要我们返回差值。所以我们采用动态规划01背包来做&#xff0…

2024.2.19

1.使用fread和fwrite完成两个文件的拷贝 #include<myhead.h> int main(int argc, const char *argv[]) {FILE *fpNULL;if((fpfopen("./zhanmusi.bmp","r"))NULL){perror("fopen error");return -1;}//fseek(fp,54,SEEK_SET);//3200054cha…

猫头虎分享: All in AI时代来临,作为程序员我们应该做些什么?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

左右联动布局效果

效果图&#xff1a; <template><el-dialog :modelValue"modelValue" :before-close"close" fullscreen :close-on-click-modal"false"><div class"farmer_detail"><div class"info_content"><di…

精工电联:定制精工线缆,赋能科技互联---致力于为客户提供卓越的连接线缆和连接器产品

精工电联 “定制精工线缆 &#xff0c;赋能科技互联”&#xff0c;精工电联致力于为高科技产业提供全方位、多维度的集成线缆解决方案。凭借深厚的研发实力和丰富的行业经验&#xff0c;精工电联已经成功地在工控设备、医疗设备、人工智能、新能源领域、轨道交通和超声波设备等…

HCIP---OSPF

题目&#xff1a; 一&#xff1a;IP规划并配置 全网拿192.16.0.0/16划分&#xff0c;先按区域划分&#xff0c;一共有五个区域加上一共RIP网段&#xff0c;要借三位。 255.255. 11100000.00000000 172.16. 00000000.00000000 172.16.0.0/19 区域0 172.16. 00100000.00…

PostgreSQL按日期列创建分区表

在PostgreSQL中&#xff0c;实现自动创建分区表主要依赖于表的分区功能&#xff0c;这一功能从PostgreSQL 10开始引入。分区表可以帮助管理大量数据&#xff0c;通过分布数据到不同的分区来提高查询效率和数据维护的便捷性。以下是在PostgreSQL中自动创建分区表的一般步骤&…

找不到android.support.v4.app.Fragment的类文件

问题 android.support.v4.app.Fragment的类文件 详细问题 笔者Android项目开发集成QQ登录 控制台报错 D:\AndroidProjects\assistingAgriculture\app\src\main\java\com\example\assistingagriculture\activity\normal_mode\QQLoginActivity.java:43: 错误: 无法访问Fragme…

Compose 1.6 发布:性能大升级、拖放新功能、文本新变化...

翻译自&#xff1a; https://android-developers.googleblog.com/2024/01/whats-new-in-jetpack-compose-january-24-release.html 基于 1 月 24 号的 Compose 发行计划&#xff0c;我们正式推出了 Jetpack Compose 1.6 版本。 作为 Android 平台备受推崇的原生 UI 工具包&…