力扣题目训练(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);elsefor(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 的 stepsteps[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.mzph.cn/news/692148.shtml

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

相关文章

Mysql Day06

sql优化 插入数据 大批量插入数据 主键顺序插入性能高于乱序插入 load data local infile /root/load_user_100w_sort.sql into table tb_user fields terminated by , lines terminated by \n ; 主键优化 这个黄色的都是一个一个Page 主键乱序插入之后会变成1-3-2&#x…

qt - 19种精美软件样式

qt - 19种精美软件样式 一、效果演示二、核心程序三、下载链接 一、效果演示 二、核心程序 #include "mainwindow.h"#include <QtAdvancedStylesheet.h> #include <QmlStyleUrlInterceptor.h>#include "ui_mainwindow.h" #include <QDir&g…

从零开始学习Netty - 学习笔记 - NIO基础 - ByteBuffer: 简介和基本操作

NIO基础 1.三大组件 1.1. Channel & Buffer Channel 在Java NIO&#xff08;New I/O&#xff09;中&#xff0c;“Channel”&#xff08;通道&#xff09;是一个重要的概念&#xff0c;用于在非阻塞I/O操作中进行数据的传输。Java NIO提供了一种更为灵活和高效的I/O处理方…

基于微信小程序的日语学习的系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

中台的介绍及讲解

什么是中台 公司在新的一年规划中提出了新的发展战略&#xff0c;我们老板听说最近中台的概念很火&#xff0c;让我们调研公司实习中台战略的可行性&#xff0c;于是乎最近一段时间被老板折腾得够呛。刚开始并不理解什么是中台… 因此&#xff0c;写篇博客先简单介绍下什么是中…

mp3播放器

无界面播放器 一、首先需要一个存放音乐文件的路径 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <glob.h> #include <signal.h>int menu(void); void fu…

24-k8s的附件组件-Metrics-server组件与hpa资源pod水平伸缩

一、概述 Metrics-Server组件目的&#xff1a;获取集群中pod、节点等负载信息&#xff1b; hpa资源目的&#xff1a;通过metrics-server获取的pod负载信息&#xff0c;自动伸缩创建pod&#xff1b; 参考链接&#xff1a; 资源指标管道 | Kubernetes https://github.com/kuberne…

静态时序分析:SDC约束命令set_input_delay详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 本章将讨论使用set_input_delay命令对输入端口的约束。首先需要说明的是&#xff0c;在进行静态时序分析时&#xff0c;任何一条时序路径都需要有约束&#xff0…

如何使用安卓平板远程Ubuntu服务器通过VS Code远程开发

文章目录 1.ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址6.结语 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;…

【.NET Core】常见C#代码约定

【.NET Core】常见C#代码约定 文章目录 【.NET Core】常见C#代码约定一、概述二、代码预定的目标三、代码约束工具和分析器四、C#语言准则五、字符串约定5.1 使用字符串内插来连接短字符串5.2 插入大文本时&#xff0c;使用System.Text.StringBuilder对象 六、数组约定七、委托…

php数组运算符 比较 isset、is_null、empty的用法和区别

php数组运算符 1. 数组运算符2. 判断两个数组是否相等3. isset、is_null、empty的用法和区别 1. 数组运算符 注意&#xff1a;只会保留第一个数组中的键值对&#xff0c;而忽略后面数组中相同键名的元素&#xff0c;如果想要合并两个数组并覆盖相同键名的元素&#xff0c;可以…

C与C++的性能差距来源于哪里?

C与C的性能差距来源于哪里&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xf…

SpringBoot图书管理系统

介绍 图书管理系统助力于图书馆中图书的管理&#xff0c;功能包含图书管理、借阅、归还&#xff0c;三块业务的解决方案&#xff0c;可对图书进行查询、查询图书剩余数量及借阅记录和状态、监控数量不足的图书。 使用技术 SpringBootMyBatisThymeleafMySQL 项目结构 业务流…

五种多目标优化算法(MOAHA、MOGWO、NSWOA、MOPSO、NSGA2)性能对比,包含6种评价指标,9个测试函数(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOAHA 1.2MOGWO 1.3NSWOA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff…

体验一下UE5.3的Skeletal Editor

UE5.3中增加了蒙皮网格骨架编辑工具&#xff0c;用户无需导出Fbx就可以直接编辑蒙皮网格&#xff0c;支持修改绑定姿势的骨骼位置、修改蒙皮权重、对已蒙皮多边形进行编辑以及对蒙皮网格减免等操作&#xff0c;就来体验一下。 1.加载插件 要使用Skeletal Editor功能&#xff…

SpringBoot中使用PageHelper插件实现Mybatis分页

场景 SpringBoot中整合Mybatis时一般添加的依赖为 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.1</version></dependency> 如果要实现分页查…

PostgreSQL里实现计算多个数字的排列组合

在进行排列组合的时候&#xff0c;每一次需要知道是否有重复的值&#xff0c;并过滤出已经排列过的值。这个可以创建支持可变参数的函数来实现。下边的函数用到了聚合判断&#xff0c;并且可变参数使用variadic标记的数组。 postgres<16.1>(ConnAs[postgres]:PID[188277…

基于shp数据制作3DTiles建筑白膜

经纬管网建模系统MagicPipe3D&#xff0c;本地离线参数化构建地下管网、建筑三维模型&#xff0c;输出标准3DTiles服务、Obj模型等格式&#xff0c;支持Cesium、Unreal、Unity、Osg等引擎加载进行三维可视化、语义查询、专题分析。欢迎下载试用&#xff1a;http://www.magic3d.…

二百二十四、Kettle——曲线实现从Hive插入更新到ClickHouse(分区字段是month或year)

一、目的 对于以month、year为分区字段的数据&#xff0c;不是像day字段分区那样每天增量插入更新即可&#xff0c;而是要以部分字段查询、部分字段更新&#xff0c;但是ClickHouse数据库并不适合更新操作&#xff0c;直接使用Kettle的插入更新控件会导致问题&#xff0c;必须…

Java项目,营销抽奖系统设计实现

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 项目&#xff1a;https://gaga.plus 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 大家好&#xff0c;我是技术UP主&#xff0c;小傅哥。 经过这个假期的嘎嘎卷&#x1f9e8;…