练习题(2024/4/9)

1 下一个排列

整数数组的一个 排列  就是将其所有成员以序列或线性顺序排列。

  • 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3][1,3,2][3,1,2][2,3,1] 。

整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

  • 例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。
  • 类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
  • 而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。

给你一个整数数组 nums ,找出 nums 的下一个排列。

必须 原地 修改,只允许使用额外常数空间。

示例 1:

输入:nums = [1,2,3]
输出:[1,3,2]

示例 2:

输入:nums = [3,2,1]
输出:[1,2,3]

示例 3:

输入:nums = [1,1,5]
输出:[1,5,1]

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 100

思路:

  1. 找到交换点: 从右往左找到第一个非递增的元素,记为索引 i。如果找不到这样的元素,说明当前排列已经是最大排列,直接将整个数组逆序,得到最小排列。

  2. 交换位置: 在索引 i 右边的元素中,找到比 nums[i] 大的最小元素,记为索引 j。交换 nums[i] 和 nums[j]

  3. 调整顺序: 将索引 i 右边的元素按升序排列,以确保下一个排列是大于当前排列的最小排列。

过程

  1. 从倒数第二个元素开始向前遍历数组,找到第一个比后一个元素小的元素的索引 i。
  2. 如果找到了这样的元素,再从数组的最后一个元素开始向前遍历,找到第一个比 nums[i] 大的元素的索引 j。
  3. 将 nums[i] 和 nums[j] 交换位置。
  4. 将索引 i+1 到末尾的元素进行排序,使其成为下一个排列的最小序列。
  5. 如果没有找到符合条件的元素,则将整个数组反转,得到最小的排列

代码:

class Solution {
public:// 下一个排列void nextPermutation(vector<int>& nums) {// 如果数组长度小于等于1,则无需处理if (nums.size() <= 1) {return;}// 从倒数第二个元素开始向前遍历for (int i = nums.size() - 2; i >= 0; --i) {// 找到第一个比后一个元素小的元素if (nums[i] < nums[i + 1]) {// 从后向前找到第一个比 nums[i] 大的元素,进行交换for (int j = nums.size() - 1; j > i; --j) {if (nums[i] < nums[j]) {swap(nums[i], nums[j]);// 将 i+1 到末尾的元素进行排序,使其成为下一个排列的最小序列sort(nums.begin() + i + 1, nums.end());return;}}}}// 如果没有找到符合条件的元素,则将整个数组反转,得到最小的排列sort(nums.begin(), nums.end());}
};

2 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 为 无重复元素 的 升序 排列数组
  • -104 <= target <= 104

思路:

  1. 初始化指针: 将左指针 left 初始为数组的首位置,右指针 right 初始为数组的尾位置。

  2. 二分查找: 在左指针小于等于右指针的条件下,执行二分查找算法:

    • 计算中间位置 middle
    • 如果中间元素小于目标值 target,则将左指针移到中间位置的右边一位。
    • 如果中间元素大于目标值 target,则将右指针移到中间位置的左边一位。
    • 如果中间元素等于目标值 target,直接返回中间位置索引。

代码:

class Solution {
public:// 搜索插入位置int searchInsert(vector<int>& nums, int target) {// 左指针初始为数组首位置,右指针初始为数组尾位置int left = 0;int right = nums.size() - 1;// 在左指针小于等于右指针的条件下进行循环while(left <= right){// 计算中间位置int middle = left + ((right - left) / 2);// 如果中间元素小于目标值,则将左指针移到中间位置的右边一位if (nums[middle] < target){left = middle + 1;}// 如果中间元素大于目标值,则将右指针移到中间位置的左边一位else if (nums[middle] > target){right = middle - 1;}// 如果中间元素等于目标值,则直接返回中间位置索引else {return middle;}}// 如果循环结束仍未找到目标值,则返回左指针位置,即插入位置return left;}
};

3体育馆的人流量

表:Stadium

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| visit_date    | date    |
| people        | int     |
+---------------+---------+
visit_date 是该表中具有唯一值的列。
每日人流量信息被记录在这三列信息中:序号 (id)、日期 (visit_date)、 人流量 (people)
每天只有一行记录,日期随着 id 的增加而增加

编写解决方案找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录。

返回按 visit_date 升序排列 的结果表。

查询结果格式如下所示。

示例 1:

输入:
Stadium 表:
+------+------------+-----------+
| id   | visit_date | people    |
+------+------------+-----------+
| 1    | 2017-01-01 | 10        |
| 2    | 2017-01-02 | 109       |
| 3    | 2017-01-03 | 150       |
| 4    | 2017-01-04 | 99        |
| 5    | 2017-01-05 | 145       |
| 6    | 2017-01-06 | 1455      |
| 7    | 2017-01-07 | 199       |
| 8    | 2017-01-09 | 188       |
+------+------------+-----------+
输出:
+------+------------+-----------+
| id   | visit_date | people    |
+------+------------+-----------+
| 5    | 2017-01-05 | 145       |
| 6    | 2017-01-06 | 1455      |
| 7    | 2017-01-07 | 199       |
| 8    | 2017-01-09 | 188       |
+------+------------+-----------+
解释:
id 为 5、6、7、8 的四行 id 连续,并且每行都有 >= 100 的人数记录。
请注意,即使第 7 行和第 8 行的 visit_date 不是连续的,输出也应当包含第 8 行,因为我们只需要考虑 id 连续的记录。
不输出 id 为 2 和 3 的行,因为至少需要三条 id 连续的记录。

思路:

  1. 使用自连接将 Stadium 表连接三次,分别用别名 a、b、c。
  2. 筛选满足条件的记录:每行的人数大于等于 100,并且前两行的 id 是连续的。
  3. 使用 OR 运算符来考虑三种情况:
    • 检查 b 和 c 的 id 是否连续,且 a 和 b 的 id 也连续。
    • 或者检查 a 和 c 的 id 是否连续,且 b 和 a 的 id 也连续。
    • 或者检查 c 和 b 的 id 是否连续,且 a 和 c 的 id 也连续。
  4. 最后按照 visit_date 升序排序结果。

代码:

-- 选择不重复的记录
select distinct a.*
-- 从 Stadium 表进行自连接,分别用 a、b、c 作为别名
from stadium as a, stadium as b, stadium as c 
-- 筛选满足条件的记录:每行的人数大于等于 100,并且前两行的 id 是连续的
where a.people >= 100 and b.people >= 100 and c.people >= 100
and (-- 检查 b 和 c 的 id 是否连续,且 a 和 b 的 id 也连续(b.id - a.id = 1 and c.id - b.id = 1)-- 或者检查 a 和 c 的 id 是否连续,且 b 和 a 的 id 也连续or (a.id - b.id = 1 and c.id - a.id = 1)-- 或者检查 c 和 b 的 id 是否连续,且 a 和 c 的 id 也连续or (c.id - b.id = 1 and a.id - c.id = 1)
)
-- 按照 visit_date 升序排序结果
order by a.visit_date;

4好友申请 II :谁有最多的好友

RequestAccepted 表:

+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| requester_id   | int     |
| accepter_id    | int     |
| accept_date    | date    |
+----------------+---------+
(requester_id, accepter_id) 是这张表的主键(具有唯一值的列的组合)。
这张表包含发送好友请求的人的 ID ,接收好友请求的人的 ID ,以及好友请求通过的日期。

编写解决方案,找出拥有最多的好友的人和他拥有的好友数目。

生成的测试用例保证拥有最多好友数目的只有 1 个人。

查询结果格式如下例所示。

示例 1:

输入:
RequestAccepted 表:
+--------------+-------------+-------------+
| requester_id | accepter_id | accept_date |
+--------------+-------------+-------------+
| 1            | 2           | 2016/06/03  |
| 1            | 3           | 2016/06/08  |
| 2            | 3           | 2016/06/08  |
| 3            | 4           | 2016/06/09  |
+--------------+-------------+-------------+
输出:
+----+-----+
| id | num |
+----+-----+
| 3  | 3   |
+----+-----+
解释:
编号为 3 的人是编号为 1 ,2 和 4 的人的好友,所以他总共有 3 个好友,比其他人都多。

思路:

成为朋友是一个双向的过程,所以如果一个人接受了另一个人的请求,他们两个都会多拥有一个朋友。

所以我们可以将 requester_id 和 accepter_id 联合起来,然后统计每个人出现的次数

  1. 数据准备:首先,从 RequestAccepted 表中提取所有的 requester_id 和 accepter_id,将它们视为同一类标识(id)并合并到一个结果集中。这是通过一个联合查询来完成的,其中请求者和接受者被统一命名为 id

  2. 计数:对于合并后的 id 列,使用 GROUP BY 和 COUNT(*) 来计算每个 id 出现的次数,即其好友数量。

  3. 排序和限制:对计数结果进行降序排序,以便最大数量的好友排在最前面。然后使用 LIMIT 1 只选择排在第一位的记录,即具有最多好友数量的用户。

代码:

-- 选择 id 和每个 id 出现的次数作为别名为 num 的列
select id, count(*) as num 
-- 从一个由 RequestAccepted 表的 requester_id 和 accepter_id 列组成的联合结果中选择 id
from (select requester_id as id from RequestAccepted-- 将 requester_id 列别名为 idunion allselect accepter_id as id from RequestAccepted
) as t1
-- 按照每个 id 出现的次数(num)降序排序
group by id 
order by count(*) desc 
-- 只返回排序结果的第一行
limit 1;

5      销售员


表: SalesPerson

+-----------------+---------+
| Column Name     | Type    |
+-----------------+---------+
| sales_id        | int     |
| name            | varchar |
| salary          | int     |
| commission_rate | int     |
| hire_date       | date    |
+-----------------+---------+
sales_id 是该表的主键列(具有唯一值的列)。
该表的每一行都显示了销售人员的姓名和 ID ,以及他们的工资、佣金率和雇佣日期。

表: Company

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| com_id      | int     |
| name        | varchar |
| city        | varchar |
+-------------+---------+
com_id 是该表的主键列(具有唯一值的列)。
该表的每一行都表示公司的名称和 ID ,以及公司所在的城市。

表: Orders

+-------------+------+
| Column Name | Type |
+-------------+------+
| order_id    | int  |
| order_date  | date |
| com_id      | int  |
| sales_id    | int  |
| amount      | int  |
+-------------+------+
order_id 是该表的主键列(具有唯一值的列)。
com_id 是 Company 表中 com_id 的外键(reference 列)。
sales_id 是来自销售员表 sales_id 的外键(reference 列)。
该表的每一行包含一个订单的信息。这包括公司的 ID 、销售人员的 ID 、订单日期和支付的金额。

编写解决方案,找出没有任何与名为 “RED” 的公司相关的订单的所有销售人员的姓名。

以 任意顺序 返回结果表。

返回结果格式如下所示。

示例 1:

输入:
SalesPerson 表:
+----------+------+--------+-----------------+------------+
| sales_id | name | salary | commission_rate | hire_date  |
+----------+------+--------+-----------------+------------+
| 1        | John | 100000 | 6               | 4/1/2006   |
| 2        | Amy  | 12000  | 5               | 5/1/2010   |
| 3        | Mark | 65000  | 12              | 12/25/2008 |
| 4        | Pam  | 25000  | 25              | 1/1/2005   |
| 5        | Alex | 5000   | 10              | 2/3/2007   |
+----------+------+--------+-----------------+------------+
Company 表:
+--------+--------+----------+
| com_id | name   | city     |
+--------+--------+----------+
| 1      | RED    | Boston   |
| 2      | ORANGE | New York |
| 3      | YELLOW | Boston   |
| 4      | GREEN  | Austin   |
+--------+--------+----------+
Orders 表:
+----------+------------+--------+----------+--------+
| order_id | order_date | com_id | sales_id | amount |
+----------+------------+--------+----------+--------+
| 1        | 1/1/2014   | 3      | 4        | 10000  |
| 2        | 2/1/2014   | 4      | 5        | 5000   |
| 3        | 3/1/2014   | 1      | 1        | 50000  |
| 4        | 4/1/2014   | 1      | 4        | 25000  |
+----------+------------+--------+----------+--------+
输出:
+------+
| name |
+------+
| Amy  |
| Mark |
| Alex |
+------+
解释:
根据表 orders 中的订单 '3' 和 '4' ,容易看出只有 'John' 和 'Pam' 两个销售员曾经向公司 'RED' 销售过。
所以我们需要输出表 salesperson 中所有其他人的名字。

思路:

  1. 首先,我们需要确定哪些销售员曾经向名为 “RED” 的公司销售过产品。我们可以通过联结 Orders 表和 Company 表来实现。

  2. 然后,我们将排除这些销售员,从而找出剩余的销售员。这些剩余的销售员就是没有向名为 “RED” 的公司销售过产品的销售员。

过程:

  1. 主查询目标:主查询的目标是从 SalesPerson 表中选择销售员的名字。

  2. 子查询作用:子查询的作用是筛选出在 Orders 表中没有销售给名为 ‘RED’ 的公司的销售订单的 sales_id。

  3. 子查询逻辑:子查询使用了左连接将 Orders 表与 Company 表关联,找出与名为 ‘RED’ 的公司相关的销售订单,然后通过 WHERE 子句将这些订单筛选出来。

  4. 主查询过滤:主查询使用了 NOT IN 运算符,将子查询的结果作为条件,从而排除了在子查询中出现的 sales_id,从 SalesPerson 表中选择出符合条件的销售员名字。

  5. 最终目的:该查询的最终目的是找出那些没有向名为 ‘RED’ 的公司销售过产品的销售员,并返回他们的名字。

代码:

-- 选择 SalesPerson 表中的名字列
select SalesPerson.name
-- 从 SalesPerson 表中选择名字
from SalesPerson 
-- 只选择那些在 Orders 表中销售订单的 sales_id 没有对应的记录
where sales_id not in (-- 从 Orders 表和 Company 表中选择销售订单的 sales_idselect sales_id from Orders -- 使用左连接将 Orders 表与 Company 表关联,基于 Orders 表中的 com_id 和 Company 表中的 com_idleft join Company on Orders.com_id = Company.com_id-- 筛选出公司名为 'RED' 的记录where Company.name = 'RED'
);

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

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

相关文章

2.Go的基本语法-指针、结构体、Map

1.指针 1.1.常规定义 func test24() {var a int 10var b *intb &afmt.Printf("a 的 值%d\n", a)fmt.Printf("a 的 指针地址%x\n", &a)fmt.Printf("b 的 值%d\n", *b)fmt.Printf("b 的 指针地址%x\n", b)打印var c *string…

常见通信方式之Websocket

官方文档 背景 在没有websocket之前&#xff0c;如果需要不断更新页面的某一部分信息&#xff0c;通常是采用基于http请求的单向轮询。但是轮询的话&#xff0c;一方面&#xff0c;我们又不希望过于频繁的请求服务器&#xff0c;一方面&#xff0c;又希望能够能快的收到最新的…

基于HASM模型的高精度建模matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1HASM模型概述 4.2 HASM模型的数学表述 5.完整程序 1.程序功能描述 本课题主要使用HASM进行高精度建模&#xff0c;主要对HASM模型进行介绍以及在实际中如何进行简化实现的。HASM原始的模…

SQL注入利用学习 - 延时盲注

延时盲注原理 无法利用页面显示结果判断SQL注入是否执行成功&#xff0c;此时可以利用 SQL语句执行的延时 判断SQL是 否执行成功。 只要可以执行延时&#xff0c;那么就可以利用该注入技术。 sql时间类型的盲注本质是利用插入的SQL语句执行造成时间延迟&#xff0c;插入的SQ…

gpt科普1 GPT与搜索引擎的对比

GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer架构的自然语言处理模型。它通过大规模的无监督学习来预训练模型&#xff0c;在完成这个阶段后&#xff0c;可以用于各种NLP任务&#xff0c;如文本生成、机器翻译、文本分类等。 以下是关…

【图论】Leetcode 207. 课程表【中等】

课程表 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示如果要学习课程 ai 则 必须 先学习课程 bi 。…

git-es6-promisem面试

git 工作区 暂存区 仓库区 git config --global user.name xxx git config --global user.email xxx验证是否配置成功 输入命令&#xff1a; git config --list在 c:/用户/用户名 下有 .gitconfig文件&#xff0c;存放的就是git配置的用户信息 新项目git管理步骤 初始化 g…

【VUE】Vue3+Element Plus动态间距处理

目录 1. 动态间距调整1.1 效果演示1.2 代码演示 2. 固定间距2.1 效果演示2.2 代码演示 其他情况 1. 动态间距调整 1.1 效果演示 并行效果 并列效果 1.2 代码演示 <template><div style"margin-bottom: 15px">direction:<el-radio v-model"d…

【实用工具】使用飞书机器人监控工程日志

1.创建一个飞书群聊&#xff0c;设置-->群机器人-->添加机器人-->自定义机器人-->修改机器人名称-->添加 2.复制webhook地址 3.编写日志请求代码 import logging import requests import json import os from datetime import datetime import time import sub…

19、差分矩阵

差分矩阵 题目描述 输入一个n行m列的整数矩阵&#xff0c;再输入q个操作&#xff0c;每个操作包含五个整数x1, y1, x2, y2, c&#xff0c;其中(x1, y1)和(x2, y2)表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将选中的子矩阵中的每个元素的值加上c。 请你将进行完…

LeetCode-45. 跳跃游戏 II【贪心 数组 动态规划】

LeetCode-45. 跳跃游戏 II【贪心 数组 动态规划】 题目描述&#xff1a;解题思路一&#xff1a;Python 贪心解题思路二&#xff1a;贪心优化解题思路三&#xff1a;类似于跳跃游戏一的写法解题思路四&#xff1a;动态规划 题目描述&#xff1a; 给定一个长度为 n 的 0 索引整数…

抖音视频如何下载保存(方法分享)

有时刷抖音视频&#xff0c;看的喜欢的视频想要下载到本地&#xff0c;但是有很多视频无法下载或者下载下来是有水印的&#xff0c;那怎么办呢?   抖音视频下载有两种情况&#xff1a; 一种是可以直接点击分享下载&#xff0c;然后可以直接点击保存到相册。 视频就自动下载…

云平台和云原生

目录 1.0 云平台 1.1.0 私有云、公有云、混合云 1.1.1 私有云 1.1.2 公有云 1.1.3 混合云 1.2 常见云管理平台 1.3 云管理的好处 1.3.1 多云的统一管理 1.3.2 跨云资源调度和编排需要 1.3.3 实现多云治理 1.3.4 多云的统一监控和运维 1.3.5 统一成本分析和优化 1.…

【CSS】MDN

一、CSS构建 1.1 CSS选择器 1.1.1 元素选择器 标签不区分大小写 示例&#xff1a; span {background-color: yellow; }1.1.2 通用选择器 选择文档中所有内容&#xff0c;重置样式表中使用较多 鉴于div:first-child&#xff08;代表所有的div元素&#xff0c;并且是第一个…

【目标检测】-入门知识

1、回归与分类问题 回归问题是指给定输入变量(特征)和一个连续的输出变量(标签),建立一个函数来预测输出变量的值。换句话说,回归问题的目标是预测一个连续的输出值,例如预测房价、股票价格、销售额等。回归问题通常使用回归分析技术,例如线性回归、多项式回归、决策树…

【vim 学习系列文章 18 -- 选中行前后增加两行】

请阅读【嵌入式开发学习必备专栏 之 Vim】 文章目录 选中行前后增加两行1. 定义函数2. 创建快捷键映射3. 保存并重新加载 .vimrc使用方法 重新选中实现步骤 1: 定义函数步骤 2: 绑定快捷键保存并重新加载 .vimrc使用方法 选中行前后增加两行 为了在 Vim 中实现这个功能&#x…

小程序 SSL证书的重要性与选择

随着移动互联网的迅猛发展&#xff0c;微信小程序已成为众多企业和开发者连接用户的重要平台。然而&#xff0c;随之而来的是对数据安全和隐私保护的严峻挑战。在这一背景下&#xff0c;SSL证书的作用变得尤为重要&#xff0c;它为小程序提供了一个安全的通信管道&#xff0c;确…

ChromeDriver / Selenium-server

一、简介 ChromeDriver 是一个 WebDriver 的实现&#xff0c;专门用于自动化控制 Google Chrome 浏览器。以下是关于 ChromeDriver 的详细说明&#xff1a; 定义与作用&#xff1a; ChromeDriver 是一个独立的服务器程序&#xff0c;作为客户端库与 Google Chrome 浏览…

R语言数据可视化:ggplot2绘图系统

ggpolt2绘图系统被称为R语言中最高大上的绘图系统&#xff0c;使用ggplot2绘图系统绘图就像是在使用语法创造句子一样&#xff0c;把数据映射到几何客体的美学属性上。因此使用ggplot2绘图系统的核心函数ggplot来绘图必须具备三个条件&#xff0c;数据data&#xff0c;美学属性…

41---音频电路设计

视频链接 音频电路设计01_哔哩哔哩_bilibili 音频电路设计 1、音频基本介绍 1.1、设备 1.1.1、音频接口 型号&#xff1a;ABA-JAK-038-K44 电脑主机上的音频输出插口&#xff0c;一个是粉色的&#xff0c;用来连接麦克风或话筒&#xff0c;一个是绿色的&#xff0c;用来连…