练习题(2024/5/15)

1有多少小于当前数字的数字

给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。

换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i  nums[j] < nums[i] 。

以数组形式返回答案。

示例 1:

输入:nums = [8,1,2,2,3]
输出:[4,0,1,1,3]
解释: 
对于 nums[0]=8 存在四个比它小的数字:(1,2,2 和 3)。 
对于 nums[1]=1 不存在比它小的数字。
对于 nums[2]=2 存在一个比它小的数字:(1)。 
对于 nums[3]=2 存在一个比它小的数字:(1)。 
对于 nums[4]=3 存在三个比它小的数字:(1,2 和 2)。

示例 2:

输入:nums = [6,5,4,8]
输出:[2,1,0,3]

示例 3:

输入:nums = [7,7,7,7]
输出:[0,0,0,0]

提示:

  • 2 <= nums.length <= 500
  • 0 <= nums[i] <= 100

思路:

  1. 复制原始数组,以便进行排序,排序后得到一个有序数组。排序之后,其实每一个数值的下标就代表这前面有几个比它小的了
  2. 使用哈希表记录每个数字对应的较小数字的数量,即对于每个数字,记录有多少个数字比它小。
  3. 遍历原始数组,根据哈希表记录的较小数字数量来更新结果数组,即将原始数组中的每个数字替换为对应的较小数字数量。
  4. 返回更新后的结果数组。

但有一个情况,就是数值相同怎么办?

例如,数组:1 2 3 4 4 4 ,第一个数值4的下标是3,第二个数值4的下标是4了。

这里就需要一个技巧了,在构造数组hash的时候,从后向前遍历,这样hash里存放的就是相同元素最左面的数值和下标了

代码:

class Solution {
public:vector<int> smallerNumbersThanCurrent(vector<int>& nums) {// 复制原始数组以便排序vector<int> sorted_nums = nums;// 对复制的数组进行排序sort(sorted_nums.begin(), sorted_nums.end());// 哈希表,记录每个数字对应的较小数字的数量int hash[101];// 从大到小遍历排序后的数组,记录每个数字对应的较小数字的数量for(int i = sorted_nums.size() - 1; i >= 0; i--){hash[sorted_nums[i]] = i;}// 遍历原始数组,根据哈希表记录的较小数字数量来更新结果数组for(int i = 0; i < nums.size(); i++){sorted_nums[i] = hash[nums[i]];}// 返回结果数组return sorted_nums;}
};

2有效的山脉数组

给定一个整数数组 arr,如果它是有效的山脉数组就返回 true,否则返回 false

让我们回顾一下,如果 arr 满足下述条件,那么它是一个山脉数组:

  • arr.length >= 3
  • 在 0 < i < arr.length - 1 条件下,存在 i 使得:
    • arr[0] < arr[1] < ... arr[i-1] < arr[i]
    • arr[i] > arr[i+1] > ... > arr[arr.length - 1]

示例 1:

输入:arr = [2,1]
输出:false

示例 2:

输入:arr = [3,5,5]
输出:false

示例 3:

输入:arr = [0,3,2,1]
输出:true

提示:

  • 1 <= arr.length <= 104
  • 0 <= arr[i] <= 104

思路:

判断是山峰,主要就是要严格的保证左边到中间,和右边到中间是递增的。

使用两个指针,left和right,让其按照一定规则向中间移动

  1. 如果数组长度小于3,不可能构成山脉,直接返回false。
  2. 初始化左右指针分别指向数组的两端。
  3. 向右移动左指针,直到不再递增,即找到山峰的左边界。
  4. 向左移动右指针,直到不再递减,即找到山峰的右边界。
  5. 如果左右指针相等,并且不在数组两端,则说明左右指针之间构成山脉,返回true;否则不构成山脉,返回false。

代码:

class Solution {
public:bool validMountainArray(vector<int>& arr) {// 如果数组长度小于3,不可能构成山脉if(arr.size() < 3) return false;// 左右指针初始化为数组的两端int left = 0;int right = arr.size() - 1;// 向右移动左指针,直到不再递增while(left < arr.size() - 1 && arr[left] < arr[left + 1]) left++;// 向左移动右指针,直到不再递减while(right > 0 && arr[right] < arr[right - 1]) right--;// 如果左右指针相等,并且不在数组两端,则说明左右指针之间构成山脉if (left == right && left != 0 && right != arr.size() - 1) return true;// 否则不构成山脉return false;}
};

3独一无二的出现次数

给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。

如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false

示例 1:

输入:arr = [1,2,2,1,1,3]
输出:true
解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。

示例 2:

输入:arr = [1,2]
输出:false

示例 3:

输入:arr = [-3,0,1,-3,1,1,1,-3,10,0]
输出:true

思路:

  1. 创建一个哈希映射,用于存储每个数字出现的次数。
  2. 遍历给定的整数数组,对每个数字进行计数,并将结果存储在哈希映射中。
  3. 创建一个无序集合,用于存储出现次数的唯一值。
  4. 遍历哈希映射中的每个键值对,将每个数字出现的次数加入无序集合中,这样集合中就只会包含每个数字出现的唯一次数。
  5. 最后,比较无序集合的大小和哈希映射的大小,如果它们相等,则说明每个数字出现的次数都是唯一的,返回true;否则返回false。

代码:

class Solution {
public:bool uniqueOccurrences(vector<int>& arr) {// 创建一个哈希映射,用于存储每个数字出现的次数map<int, int> my_map;// 遍历数组,统计每个数字的出现次数for(int num : arr) my_map[num]++;// 创建一个无序集合,用于存储出现次数的唯一值unordered_set<int> my_set;// 遍历哈希映射中的每个键值对,将出现次数加入无序集合for(auto num : my_map) my_set.insert(num.second);// 如果无序集合的大小等于哈希映射的大小,说明每个数字出现的次数都是唯一的return my_set.size() == my_map.size();}
};

4移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

提示:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

思路:

  1. 初始化一个慢指针 slowIndex,用于记录非零元素应该被移动到的位置。
  2. 遍历整个数组,使用一个快指针 fastIndex 来找到非零元素,并将其移动到慢指针位置。
  3. 如果当前元素不为零,则将其移动到慢指针位置,并递增慢指针 slowIndex
  4. 最后,将慢指针之后的位置(即原数组中剩余的位置)赋值为零,确保所有非零元素已经移到了数组的前面,而剩余位置都为零。

代码:

class Solution {
public:void moveZeroes(vector<int>& nums) {// 初始化慢指针int slowIndex = 0;// 遍历数组,使用快指针来找到非零元素并将其移动到慢指针位置for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {// 如果当前元素不为零if (nums[fastIndex] != 0) {// 将非零元素移动到慢指针位置nums[slowIndex++] = nums[fastIndex];}}// 将慢指针之后的冗余元素赋值为0for (int i = slowIndex; i < nums.size(); i++) {nums[i] = 0;}}
};

5员工的直属部门

表:Employee

+---------------+---------+
| Column Name   |  Type   |
+---------------+---------+
| employee_id   | int     |
| department_id | int     |
| primary_flag  | varchar |
+---------------+---------+
这张表的主键为 employee_id, department_id (具有唯一值的列的组合)
employee_id 是员工的ID
department_id 是部门的ID,表示员工与该部门有关系
primary_flag 是一个枚举类型,值分别为('Y', 'N'). 如果值为'Y',表示该部门是员工的直属部门。 如果值是'N',则否

一个员工可以属于多个部门。当一个员工加入超过一个部门的时候,他需要决定哪个部门是他的直属部门。请注意,当员工只加入一个部门的时候,那这个部门将默认为他的直属部门,虽然表记录的值为'N'.

请编写解决方案,查出员工所属的直属部门。

返回结果 没有顺序要求 。

返回结果格式如下例子所示:

示例 1:

输入:
Employee table:
+-------------+---------------+--------------+
| employee_id | department_id | primary_flag |
+-------------+---------------+--------------+
| 1           | 1             | N            |
| 2           | 1             | Y            |
| 2           | 2             | N            |
| 3           | 3             | N            |
| 4           | 2             | N            |
| 4           | 3             | Y            |
| 4           | 4             | N            |
+-------------+---------------+--------------+
输出:
+-------------+---------------+
| employee_id | department_id |
+-------------+---------------+
| 1           | 1             |
| 2           | 1             |
| 3           | 3             |
| 4           | 3             |
+-------------+---------------+
解释:
- 员工 1 的直属部门是 1
- 员工 2 的直属部门是 1
- 员工 3 的直属部门是 3
- 员工 4 的直属部门是 3

代码:

-- 查询只出现过一次的员工及其部门
(select employee_id,          -- 员工IDdepartment_id         -- 部门IDfromEmployee              -- 员工表group byemployee_id           -- 按员工ID分组having count(*) = 1          -- 只出现过一次的员工
)
union 
-- 查询主要标志为 'Y' 的员工及其部门
(select employee_id,          -- 员工IDdepartment_id         -- 部门IDfromEmployee              -- 员工表where primary_flag = 'Y'    -- 主要标志为 'Y'
)

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

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

相关文章

解决MobaXterm无法连接虚拟机问题

MobaXterm 无法连接到虚拟机可能是由于多种原因引起的。以下是一些可能的解决方法&#xff1a; 检查网络配置&#xff1a; 确保虚拟机和 MobaXterm 所在的主机在同一网络中&#xff0c;并且能够相互通信。可以尝试使用 ping 命令来测试两者之间的连通性。确保虚拟机的网络设置正…

Spring 各版本发布时间与区别

版本版本特性Spring Framework 1.01. 所有代码都在一个项目中 2. 支持核心功能IoC、AOP 3. 内置支持Hibernate、iBatis等第三方框架 4. 对第三方技术简单封装。如&#xff1a;JDBC、Mail、事务等 5. 只支持XML配置方式。6.主要通过 XML 配置文件来管理对象和依赖关系&#xff0…

时间序列预测:探索性数据分析和特征工程的实用指南

时间序列分析是数据科学和机器学习领域最广泛的主题之一:无论是预测金融事件、能源消耗、产品销售还是股票市场趋势&#xff0c;这一领域一直是企业非常感兴趣的领域。 随着机器学习模型的不断进步&#xff0c;使除了传统的统计预测方法(如回归模型、ARIMA模型、指数平滑)外&a…

Benedict Evans:Ways to think about AGI思考 AGI 的方法:

​Benedict Evans本文发布于2024 年 5 月 4 日 How do we think about a fundamentally unknown and unknowable risk, when the experts agree only that they have no idea? 当专家们一致认为他们一无所知时&#xff0c;我们如何看待根本上未知和不可知的风险&#xff1f; T…

程序验证之Dafny--证明霍尔逻辑的半自动化利器

一、What is Dafny?【来自官网介绍 Dafny 】 1)介绍 Dafny 是一种支持验证的编程语言&#xff0c;配备了一个静态程序验证器。 通过将复杂的自动推理与熟悉的编程习语和工具相结合&#xff0c;使开发者能够编写可证明正确的代码&#xff08;相对于 {P}&#xff33;{Q} 这种…

表白成功率百分百的向女朋友表白网页源代码,向女友表白HTML源代码

表白成功率百分百的向女朋友表白网页源代码&#xff0c;向女友表白HTML源代码 效果&#xff1a; 完整代码下载地址&#xff1a;向女友表白HTML源代码 <!DOCTYPE html> <!--STATUS OK--> <html><head><meta http-equiv"Content-Type" c…

玩转Matlab-Simscape(初级)-01-从一个简单模型开始学习之旅

** 玩转Matlab-Simscape&#xff08;初级&#xff09;- 01 - 从一个简单模型开始学习之旅 ** 目录 玩转Matlab-Simscape&#xff08;初级&#xff09;- 01 - 从一个简单模型开始学习之旅 前言一、从模板开始建模二、建模一个简单的连杆2.1 建模2.2 生成子系统 总结 前言 在产…

23.HashMap的put方法流程

一、put方法的流程图 二、put方法的执行步骤 首先&#xff0c;根据key值计算哈希值。然后判断table数组是否为空或者数组长度是否为0&#xff0c;是的话则要扩容&#xff0c;resize&#xff08;&#xff09;。接着&#xff0c;根据哈希值计算数组下标。如果这个下标位置为空&a…

第 397 场 LeetCode 周赛题解

A 两个字符串的排列差 模拟&#xff1a;遍历 s s s 记录各字符出现的位置&#xff0c;然后遍历 t t t 计算排列差 class Solution {public:int findPermutationDifference(string s, string t) {int n s.size();vector<int> loc(26);for (int i 0; i < n; i)loc[s…

合并K个升序链表

题目 解法一 优先级队列 思想 将每个链表中的一个节点存放到优先级队列中&#xff0c;本题采用小根堆&#xff0c;将小根堆中的根节点取出&#xff0c;插入到最终的链表中&#xff0c;并且将该节点在原链表中的下一个节点插入小根堆中&#xff08;需要向下调整&#xff09;&a…

【019】基于SSM+JSP实现的进销存管理系统

项目介绍 进销存管理系统是对企业生产经营中物料流、资金流进行条码全程跟踪管理&#xff0c;从接获订单合同开始&#xff0c;进入物料采购、入库、领用到产品完工入库、交货、回收货款、支付原材料款等&#xff0c;每一步都为您提供详尽准确的数据。有效辅助企业解决业务管理…

【机器学习】:基于决策树与随机森林对数据分类

机器学习实验报告&#xff1a;决策树与随机森林数据分类 实验背景与目的 在机器学习领域&#xff0c;决策树和随机森林是两种常用的分类算法。决策树以其直观的树形结构和易于理解的特点被广泛应用于分类问题。随机森林则是一种集成学习算法&#xff0c;通过构建多个决策树并…

kafka用java收发消息

用java客户端代码来对kafka收发消息 具体代码如下 package com.cool.interesting.kafka;import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; i…

商品服务:SPUSKU规格参数销售属性

1.Object划分 1.PO&#xff08;Persistant Object&#xff09;持久对象 PO就是对应数据库中某个表中的一条记录&#xff0c;多个记录可以用PO的集合。PO中应该不报含任何对数据库的操作 2.DO(Domain Object) 领域对象 就是从现实世界中抽象出来的有形或无形的业务实体。 3…

SPI通信(使用SPI读写W25Q64)

SPI通信协议 • SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线 • 四根通信线&#xff1a; SCLK:串行时钟线&#xff0c;用来提供时钟信号的。 MOSI:主机输出&#xff0c;从机输入 MISO:从机输出&#xff0c;主机输入 SS:…

Java中的数据类型与变量

引言&#xff1a; 哈喽&#xff0c;各位读者老爷们大家好呀,long time no see!这里是小堇Java小课堂&#xff0c;在本课堂中我们将继续分享Java中的数据类型与变量&#xff0c;标识符&#xff0c;关键字等知识&#xff0c;那我们启程咯&#xff01; 数据类型与变量 1.字面变量…

红蓝对抗 网络安全 网络安全红蓝对抗演练

什么是红蓝对抗 在军事领域&#xff0c;演习是专指军队进行大规模的实兵演习&#xff0c;演习中通常分为红军、蓝军&#xff0c;演习多以红军守、蓝军进攻为主。类似于军事领域的红蓝军对抗&#xff0c;网络安全中&#xff0c;红蓝军对抗则是一方扮演黑客&#xff08;蓝军&…

pytest教程-46-钩子函数-pytest_sessionstart

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_report_testitemFinished钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_sessionstart钩子函数的使用方法。 pytest_sessionstart 是 Pytest 提供的一个钩子函数&#xff0c…

Anaconda下载安装

看到这篇文章的同学们&#xff0c;说明你们是要下载Anaconda&#xff0c;这篇文章讲的就是下载安装教程。 Anaconda下载网址&#xff1a; Download Now | Anaconda 根据我们需要的系统版本下载&#xff0c;我的电脑是window&#xff0c;所以选择第一个&#xff0c;如下图&am…

javaEE进阶——SpringBoot与SpringMVC第一讲

文章目录 什么是springMVCSpringMVC什么是模型、视图、控制器MVC和SpringMVC的关系SpringMVC的使用第一个SpringMVC程序RestController什么是注解 那么RestController到底是干嘛的呢&#xff1f;RequestMapping 如何接收来自请求中的querystryingRequestParamRequestMapping(&q…