LeetCode 1731, 151, 148
目录
- 1731. 每位经理的下属员工数量
- 题目链接
- 表
- 要求
- 知识点
- 思路
- 代码
- 151. 反转字符串中的单词
- 题目链接
- 标签
- 思路
- 代码
- 148. 排序链表
- 题目链接
- 标签
- Collections.sort()
- 思路
- 代码
- 归并排序
- 思路
- 代码
1731. 每位经理的下属员工数量
题目链接
1731. 每位经理的下属员工数量
表
- 表
Employees
的字段为employee_id
、name
、reports_to
和age
。
要求
- 编写一个解决方案来返回需要听取汇报的所有经理的 ID、名称、直接向该经理汇报的员工人数,以及这些员工的平均年龄,其中该平均年龄需要四舍五入到最接近的整数。
- 返回的结果集需要按照
employee_id
进行排序。
知识点
round()
:四舍五入的函数。count()
:统计个数的函数。avg()
:求平均值的函数。group by
:根据某些字段进行分组。order by
:根据某些字段进行排序。
思路
可以先按经理的id report_to AS manager_id
统计(将查询结果作为一张表)出直接向该经理汇报的员工人数、平均年龄(需要四舍五入到整数位),然后再将 Employees
作为经理的表 m
,与这张子表 sub
进行多表查询,限制条件为 m.employee_id == sub.manager_id
,最后再根据 employee_id
进行排序即可。
代码
selectemployee_id,name,reports_count,average_age
fromEmployees m,(selectreports_to manager_id,count(*) reports_count,round(avg(age), 0) average_agefromEmployeesgroup bymanager_id) sub
whereemployee_id = manager_id
order byemployee_id
151. 反转字符串中的单词
题目链接
151. 反转字符串中的单词
标签
双指针 字符串
思路
本题可以使用 J a v a Java Java字符串的 s p l i t ( ) split() split()方法,这个方法可以按模式字符串分割原字符串,并且会保留空字符串,比如" main".split(" ")
的结果是[, main]
而不是[main]
。
针对空串,需要遍历 s p l i t ( ) split() split()返回的数组,将长度不为0的字符串(即不是空串)加入到一个链表中(为什么使用链表?因为不知道最终非空字符串的个数),再使用 C o l l e c t i o n s . r e v e r s e ( ) Collections.reverse() Collections.reverse()方法将链表反转,最后将这个链表转为 O b j e c t [ ] Object[] Object[],这就得到了一个字符串数组,然后将这些字符串通过 S t r i n g B u i l d e r StringBuilder StringBuilder拼接得到结果。
注意, S t r i n g B u i l d e r StringBuilder StringBuilder的 . a p p e n d ( ) .append() .append()方法的返回值仍然是 S t r i n g B u i l d e r StringBuilder StringBuilder,也就是说 . a p p e n d ( ) .append() .append()支持链式编程,即可以将builder.append(" " + str)
写作builder.append(" ").append(str)
。
代码
class Solution {public String reverseWords(String s) {Object[] split = split(s);int n = split.length;// 如果字符串的个数为0,则返回空串if (n == 0) {return "";}// 拼接单词和空格StringBuilder builder = new StringBuilder();builder.append(split[0]); // 上面的判断已经保证至少有一个单词,所以可以先拼接第1个单词for (int i = 1; i < split.length; i++) {builder.append(" ").append(split[i]);}return builder.toString();}// 将字符串分成单词的数组并反转private Object[] split(String s) {List<String> list = new ArrayList<>();for (String str : s.split(" ")) {if (str.length() != 0) {list.add(str);}}Collections.reverse(list);return list.toArray();}
}
148. 排序链表
题目链接
148. 排序链表
标签
链表 双指针 分治 排序 归并排序
Collections.sort()
思路
相信看到这道题后,想到的第一个方法就是先将链表转为节点数组,然后对节点数组进行排序,最后再将节点数组转换为链表,这样做完全可以。
在 J a v a Java Java中,可以使用 C o l l e c t i o n s . s o r t ( ) Collections.sort() Collections.sort()方法对 L i s t List List的实现类(比如 A r r a y L i s t , L i n k e d L i s t ArrayList, LinkedList ArrayList,LinkedList)进行排序,传入 一个 L i s t List List集合 和 匿名内部类或Lambda表达式 就可以排序了。所以第一步是将链表转化为 L i s t List List集合,第二步是对 L i s t List List集合进行排序,第三步是将有序的 L i s t List List集合转化为链表返回。
代码
class Solution {public ListNode sortList(ListNode head) {// 先将链表转为java中的ListList<ListNode> list = new ArrayList<>();while (head != null) {list.add(head);head = head.next;}// 对List进行排序Collections.sort(list, (n1, n2) -> n1.val - n2.val);// 将有序List转化为链表ListNode sentinel = new ListNode();ListNode curr = sentinel;for (ListNode node : list) {curr.next = node;curr = curr.next;}curr.next = null; // 防止成为循环链表,这一步很关键return sentinel.next;}
}
归并排序
思路
上面的办法虽然好,但出这道题的人可能不希望这样解,他希望使用 归并排序 的思想对本题进行求解。
归并排序的思想是 分治,对一个长链表进行排序,可以先把其分为很多段(直到不可再分,即只剩一个节点),然后对每段都排序,最后再合成这些有序的短链表为长链表。
对于合并两个有序链表,可以看我写的这篇文章 21. 合并两个有序链表。
可以先求出链表的长度,代码如下,其中 n
是链表的长度:
int n = 0;
for (ListNode curr = head; curr != null; curr = curr.next) {n++;
}
然后再进行归并排序,先从短链表的长度为0开始,每次合并完所有短链表后,将短链表的长度扩大1倍,然后再进行合并,直到短链表的长度比长链表大。
每次合并得先得到两个短链表,然后才能合成,当合并到最后两个短链表时,这两个短链表的长度可能不够这轮归并所要求的短链表长度,但无所谓,依然可以将其合并一次,除了消耗一点点时间外没有任何影响。
注意:合并完短链表后,短链表和长链表是分开的,所以需要重建它们之间的关系。
只说这些思路是远远不够的,本题的难点在于对边界值的判断,这就需要大家极其仔细了,具体看代码的注释吧。
代码
class Solution {public ListNode sortList(ListNode head) {// 如果链表为空,则返回空;如果链表只有一个节点,则不需要排序if (head == null || head.next == null) {return head;}// 先统计链表的长度int n = 0;for (ListNode curr = head; curr != null; curr = curr.next) {n++;}// 再进行归并排序ListNode sentinel = new ListNode(-1, head);for (int subN = 1; subN < n; subN <<= 1) { // subN是短链表的长度// prev指向待合成的两个短链表的第一个短链表的头节点ListNode prev = sentinel, curr = sentinel.next;while (curr != null) {// 找第一个长度为subN的短链表ListNode list1 = curr; // list1为短链表的头节点// i从1开始是因为list1也算一个节点,所以只需要走subN-1步就能得到长度为subN的短链表for (int i = 1; i < subN && curr.next != null; i++) {curr = curr.next;}// 找第二个长度为subN的短链表// 把curr.next赋值给list2 是因为 curr是第一个短链表的最后一个节点ListNode list2 = curr.next; // list2为短链表的头节点curr.next = null; // 将第一个短链表和第二个短链表分开curr = list2; // curr从第二个短链表的头节点开始// i从1开始是因为list1也算一个节点,所以只需要走subN-1步就能得到长度为subN的短链表// 由于curr从原先的curr.next开始,不知道原先的curr.next是否为null,所以需要加上curr != null的判断条件for (int i = 1; i < subN && curr != null && curr.next != null; i++) {curr = curr.next;}// 处理下一个短链表ListNode next = null; // next是下一个长度为subN的短链表的头节点if (curr != null) { // 如果curr不为null,那就意味着第二个短链表的长度为subNnext = curr.next; // 此时把curr.next 赋值给 下一个短链表的头节点curr.next = null; // 将第二个短链表和下一个短链表分开}// 合并两个有序短链表,merged是合并后链表的头节点ListNode merged = mergeTwoLists(list1, list2);// 将短链表接入长链表prev.next = merged;while (prev.next != null) { // 让prev到短链表的最后一个节点prev = prev.next;}// 更新curr到下一个短链表的头节点处curr = next;}}return sentinel.next;}// 合并两个有序链表private ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode sentinel = new ListNode(-1); // 定义一个哨兵节点,返回它的nextListNode curr = sentinel;// 1. 先把小的节点加到哨兵节点上,直到两个链表任意一个为空while (list1 != null && list2 != null) {if (list1.val < list2.val) {curr.next = list1;list1 = list1.next;} else {curr.next = list2;list2 = list2.next;}curr = curr.next;}// 2. 如果链表1不为空,则加上它剩余的部分if (list1 != null) {curr.next = list1;} else { // 否则链表2不为空,加上它剩余的部分(就算链表2为空,也是加上一个null,对结果不影响)curr.next = list2;}// 3. 返回哨兵节点的next,因为它指向结果链表return sentinel.next;}
}
相关文章:
LeetCode 1731, 151, 148
目录 1731. 每位经理的下属员工数量题目链接表要求知识点思路代码 151. 反转字符串中的单词题目链接标签思路代码 148. 排序链表题目链接标签Collections.sort()思路代码 归并排序思路代码 1731. 每位经理的下属员工数量 题目链接 1731. 每位经理的下属员工数量 表 表Emplo…...
Codeforces Round 953 (Div. 2)(A~D题解)
这次比赛是我最顺利的一次比赛,也是成功在中途打进前1500,写完第三道题的时候也是保持在1600左右,但是后面就啥都不会了,还吃了点罚时,虽说如此也算是看到进步了,D题学长说很简单,但是我当时分析…...
晶圆切割机(晶圆划片机)为晶圆加工重要设备 我国市场国产化进程不断加快
晶圆切割机(晶圆划片机)为晶圆加工重要设备 我国市场国产化进程不断加快 晶圆切割机又称晶圆划片机,指能将晶圆切割成芯片的机器设备。晶圆切割机需具备切割精度高、切割速度快、操作便捷、稳定性好等特点,在半导体制造领域应用广…...
39、基于深度学习的(拼音)字符识别(matlab)
1、原理及流程 深度学习中常用的字符识别方法包括卷积神经网络(CNN)和循环神经网络(RNN)。 数据准备:首先需要准备包含字符的数据集,通常是手写字符、印刷字符或者印刷字体数据集。 数据预处理࿱…...
CCF 矩阵重塑
第一题:矩阵重塑(一) 本题有两种思路 第一种 (不确定是否正确 但是100分) #include<iostream> using namespace std; int main(){int n,m,p,q,i,j;cin>>n>>m>>p>>q;int a[n][m];for(i…...
Aigtek高压放大器在柔性爬行机器人驱动性能研究中的应用
实验名称:柔性爬行机器人的材料测试 研究方向:介电弹性体的最小能量结构是一种利用DE材料的电致变形与柔性框架形变相结合设计的新型柔性驱动器,所谓最小能量是指驱动器在平衡状态时整个系统的能量最小,当系统在外界的电压刺激下就…...
Postman下发流表至Opendaylight
目录 任务目的 任务内容 实验原理 实验环境 实验过程 1、打开ODL控制器 2、网页端打开ODL控制页面 3、创建拓扑 4、Postman中查看交换机的信息 5、L2层流表下发 6、L3层流表下发 7、L4层流表下发 任务目的 1、掌握OpenFlow流表相关知识,理解SDN网络中L…...
C语言王国——数组的旋转(轮转数组)三种解法
目录 一、题目 二、分析 2.1 暴力求解法 2.2 找规律 2.3 追求时间效率,以空间换时间 三、结论 一、题目 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出…...
MySQL中CAST和CONVERT函数都用于数据类型转换
在 MySQL 中,CAST() 和 CONVERT() 函数都用于数据类型转换。虽然这两个函数在大多数情况下可以互换使用,但它们之间还是有一些细微的差别。 官方文档地址 https://dev.mysql.com/doc/refman/8.4/en/cast-functions.html#function_cast CAST() 函数 C…...
速盾:cdn影响seo吗?
CDN (Content Delivery Network) 是一个分布式网络架构,用于在全球范围内加速网站内容的传输和分发。它通过将网站的静态资源(例如图片、CSS、JavaScript 文件等)存储在多个服务器上,使用户可以从最接近他们位置的服务器上获取这些…...
期末算法复习
0-1背包问题(动态规划) 例题 算法思想: 动态规划的核心思想是将原问题拆分成若干个子问题,并利用已解决的子问题的解来求解更大规模的问题。 主要是状态转移方程和状态 算法描述: 初始化一个二维数组dp࿰…...
可穿戴设备:苹果“吃老底”、华为“忙复苏”、小米“再扩容”
配图来自Canva可画 随着产品功能的创新,可穿戴设备不再被简单地视为手机的延伸,而是被当成一种独立的、具有独特功能和优势的产品,受到了越来越多人的青睐。 一方面,技术的进步使得可穿戴设备在功能、性能和使用体验上得到显著提…...
AI数据分析:集中度分析和离散度分析
在deepseek中输入提示词: 你是一个Python编程专家,要完成一个Python脚本编写的任务,具体步骤如下: 读取Excel表格:"F:\AI自媒体内容\AI行业数据分析\toolify月榜\toolify2023年-2024年月排行榜汇总数据.xlsx&qu…...
redis的分布式session和本地的session有啥区别
在web应用开发中,Session用于在多个请求之间存储用户数据。传统上,Session存储在服务器的内存中,即本地Session。然而,随着应用规模和复杂度的增加,特别是在分布式环境中,本地Session会遇到一些问题。这时&…...
SSH概念、用途、详细使用方法
还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,ech…...
关于电脑文件的规划思考
概述 设置C、D、E、F 四个盘 C盘:系统数据使用,操作系统、其他软件需要用到的系统性资源 D盘:应用软件区 的使用,数据库、navacat、idea、visual studio、浏览器、向日葵、虚拟机…… E盘:工作区:公司资料…...
DVWA - Brute Force
DVWA - Brute Force 等级:low 直接上bp弱口令爆破,设置变量,攻击类型最后一个,payload为用户名、密码简单列表 直接run,长度排序下,不一样的就是正确的用户名和密码 另解: 看一下…...
安卓手机文件找回方法汇总,3个技巧,不再焦虑
我们用手机来储存各种重要的信息和文件,无论是珍贵的照片、重要的文档还是喜爱的音乐,用来记录和分享生活中的每一个瞬间。但如果不小心删除了这些文件,我们可能会面临数据丢失的风险,进而产生焦虑和不安。本文将为您揭秘手机文件…...
{}初始化
文章目录 ()初始化的问题易混淆弱检查 {}初始化{}初始化是c11推荐的初始化,解决了上述的问题 ()则被用于强制类型转换 ()初始化的问题 易混淆 string s();不能确定是函数定义还是对象定义 弱检查 int a(3.14);3.14 可以通过 int 定义 {}初始化 {}初始化是c11推…...
小程序外卖开发中的关键技术与实现方法
小程序外卖服务凭借其便捷性和灵活性,正成为现代餐饮行业的重要组成部分。开发一个功能完善的小程序外卖系统,需要掌握一系列关键技术和实现方法。本文将介绍小程序外卖开发中的核心技术,并提供具体的代码示例,帮助开发者理解和实…...
大数据平台之运维管理工具
大数据平台的自动化运维管理工具能够大幅提升集群管理效率,减少人为错误,提高系统的稳定性和性能。这些工具通常提供集群监控、配置管理、自动化任务执行、安全管理和故障处理等功能。以下是一些主要的大数据平台自动化运维管理工具的详细介绍࿱…...
[vue3]组件通信
自定义属性 父组件中给子组件绑定属性, 传递数据给子组件, 子组件通过props选项接收数据 props传递的数据, 在模版中可以直接使用{{ message }}, 在逻辑中使用props.message defineProps defineProps是编译器宏函数, 就是一个编译阶段的标识, 实际编译器解析时, 遇到后会进行…...
【react小项目】bmi-calculator
bmi-calculator 目录 bmi-calculator初始化项目01大致布局01代码 02完善样式02代码 03输入信息模块03代码 04 使用图表04代码 05详细记录信息渲染05代码 06 让数据变成响应式的06-1输入框的数据处理06-2图表,和记录信息的区域数据处理 07 删除功能,撤销功…...
python判断一个数是不是偶数
在Python中,你可以使用模运算符 % 来判断一个数是否为偶数。模运算符会返回两个数相除的余数。如果一个数除以2的余数为0,那么这个数就是偶数。 以下是一个简单的Python函数,用于判断一个数是否为偶数: def is_even(n):return n…...
Apipost模拟HTTP客户端
模拟HTTP客户端的软件有很多,其中比较著名的就有API-FOX、POSTMAN。 相信很多小伙伴都使用POSTMAN。这篇博客主要介绍Apipost的原因是,Apipost无需下载,具有网页版。 APIFOX的站内下载: Api-Fox,类似于PostMan的软件…...
uniapp 调用手机上安装的app (高德地图 百度地图 Apple地图 谷歌地图)
uniapp 调用手机上安装的app (高德地图 百度地图 Apple地图 谷歌地图) 效果 思路 获取手机类型(安卓/iOS)let platform uni.getSystemInfoSync().platform判断手机有没有安装需要的应用plus.runtime.isApplicationExist({action: ""}))打开应用 跳转过去plus.runt…...
如果供应商不能按时交货怎么办?
虽然说我们在采购的时候,我们会和供应商签订合同,合同上也会注明交期时间等一些必需的条件。 但是当供货商真的没有如期交货,或者交货拖延的时候,我们第一时间选择的是拿起法律武器来让对方承担违约责任吗? 显然,这选…...
【Linux应用】Linux系统的设备管理——Udev
1.udev概述 udev是 Linux2.6内核里的一个功能,它替代了原来的 devfs,成为当前 Linux 默认的设备管理工具,能够根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的创建,删除等。 udev以守护进程的形式运行&am…...
超实用!给独立开发者福音的一站式应用开发工具!
各位开发者们,是否曾经为了搭建服务、开发接口API而头痛不已?是否曾因为需要集成各种第三方认证服务而感到心力交瘁?别担心,今天我要向大家介绍的是一款专为“懒人”开发者准备的神器——MemFire Cloud。这款一站式应用开发工具不…...
华为 HarmonyOS 中国市场份额一季度超越苹果 iOS
华为 HarmonyOS 中国市场份额一季度超越苹果 iOS 根据最新发布的数据,研究机构Counterpoint Research指出,在2024年第一季度,华为的操作系统HarmonyOS在中国市场超越了苹果的iOS,成为中国市场上的第二大操作系统。 ![在这里插入…...
济南网站建设tailook/百度搜一搜
我们要开发一个简单的B2C商城,能够完成商品显示,购物车功能,订单流程就可以了,数据库我们使用SQLServer2005。数据库中有商品表,订单表,订单明细表,会员表就可以了, 数据库模型如下&…...
青岛做网站建设的公司/新东方教育培训机构
目录 一、基础概念 1、装饰器 1、装饰器本质就是函数 2、实现装饰器知识储备 1、函数即变量 2、高阶函数 3、嵌套函数 例子 1、将一个函数名作为实参传递给另外一个函数 2、返回值为函数名 3、函数嵌套函数 4、完整装饰器例子 5、装饰器高级版本 2、列表生成器 3、生成器 4、斐…...
三元里网站建设/华联股份股票
前言 随着大前端时代的来临,node在前段开发的过程中占据了越来越重要的地位,近期接受了一个项目,恰好是node做中间层模式开发的,趁此机会我也对node做中间层有了更深层次的理解,这里记录一下在这个项目中node.js做中间…...
如何查询网站死链/google关键词
使用环境(蓝色粗体字为特别注意内容) 1、软件环境:Win7 32 bit,AD(Altium Designer) 10.39. 有时候,芯片引脚比较多,需要将一个元器件分成若干个部分,具体该怎么操作呢?下面我们来看看。 正常画原理图封装…...
wordpress无法评论/seo网站优化方法
项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信小程序运动场地预约系统,前台用户使用小程序,后台管理使用基PHPMySql的B/S架构;通过后台添加开放的场地类型(比如羽毛球、篮球、网球等)、…...
营销类网站有哪些/网站推广的途径有哪些
软件生命周期(SDLC)的六个阶段 1、问题的定义及规划此阶段是软件开发方与需求方共同讨论,主要确定软件的开发目标及其可行性。2、需求分析在确定软件开发可行的情况下,对软件需要实现的各个功能进行详细分析。需求分析阶段是一个很重要的阶段,…...