练习题(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];
            }
        }
        // 将慢指针之后的冗余元素赋值为0
        for (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,          -- 员工ID
        department_id         -- 部门ID
    from
        Employee              -- 员工表
    group by
        employee_id           -- 按员工ID分组
    having 
        count(*) = 1          -- 只出现过一次的员工
)
union 
-- 查询主要标志为 'Y' 的员工及其部门
(
    select 
        employee_id,          -- 员工ID
        department_id         -- 部门ID
    from
        Employee              -- 员工表
    where 
        primary_flag = 'Y'    -- 主要标志为 'Y'
)

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

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

相关文章

【ARMv8/v9 系统寄存器 5 -- ARMv8 Cache 控制寄存器 SCTRL_EL1 使用详细介绍】

关于ARM Cache 详细学习推荐专栏&#xff1a; 【ARM Cache 专栏】 【ARM ACE Bus 与 Cache 专栏】 文章目录 ARMv8/v9 Cache 设置寄存器ARMv8 指令 Cache 使能函数测试代码 ARMv8/v9 Cache 设置寄存器 关于寄存器SCTRL_EL1 的详细介绍见文章&#xff1a;【ARMv8/v9 异常模型入…

Nacos+GateWay 搭建微服务架构

文章目录 1.当前项目架构分析1.请求多个模块的方式1.请求renren-fast模块开发环境生产环境 2.请求sunliving-commodity模块1.使用环境变量资源路径的方式2.开发环境 dev.env.js3.生产环境 prod.env.js 3.文件上传请求 sunliving-service模块1.请求后端接口&#xff08;开发环境…

Leetcode - 周赛397

目录 一&#xff0c;3146. 两个字符串的排列差 二&#xff0c;3147. 从魔法师身上吸取的最大能量 三&#xff0c;3148. 矩阵中的最大得分 四&#xff0c;3149. 找出分数最低的排列 一&#xff0c;3146. 两个字符串的排列差 本题就是求同一个字符在两个字符串中的下标之差的…

一物一码数字化营销进军调味品行业,五丰黎红“星厨俱乐部”火啦!

近日&#xff0c;由五丰黎红联合纳宝科技精心打造的小程序“星厨俱乐部”火啦&#xff01;一经上线就吸引了大量用户注册和参与&#xff0c;可以说取得了非常成功的市场反馈&#xff0c;那究竟是一个什么样的小程序&#xff0c;竟然有这么大的吸引力呢&#xff1f; 介绍小程序之…

C++ requires关键字简介

requires 是 C20 中引入的一个新关键字&#xff0c;用于在函数模板或类模板中声明所需的一组语义要求&#xff0c;它可以用来限制模板参数&#xff0c;类似于 typename 和 class 关键字。 requires关键字常与type_traits头文件下类型检查函数匹配使用&#xff0c;当requires后…

视频监控系统中,可变码率和固定码率对录像文件存储大小的影响,如何配置比较好?

目录 一、问题描述 二、视频监控的录像文件计算 &#xff08;一&#xff09;计算方法 &#xff08;二&#xff09;计算工具 三、原因分析 &#xff08;一&#xff09;检查配置 1、IPCa配置 2、IPCb配置 3、录像文件存储大小的理论值 &#xff08;二&#xff09;实际情…

五丰黎红引领新营销模式:布局一物一码数字化营销,提高调味品销量和复购率

调味品行业的销售渠道主要有餐饮、家庭消费和食品加工&#xff0c;按销售额的占比约为6&#xff1a;3&#xff1a;1&#xff0c;餐饮行业是调味品行业的供需主力。在餐饮行业中&#xff0c;“大厨”这一角色具有十分重要的地位。因此&#xff0c;借助大厨的力量成为了许多调味品…

汇聚荣科技:如何有效为拼多多店铺引流?

在电商竞争激烈的今天&#xff0c;为拼多多店铺引流是每个店主必须面对的挑战。有效的引流策略不仅能增加店铺曝光度&#xff0c;还能提升转化率&#xff0c;促进销量增长。 一、社交媒体营销 利用微信、微博等社交平台进行推广&#xff0c;可以通过发布产品信息、用户评价和促…

985大学电子信息专硕,考C语言+数据结构!中央民族大学25计算机考研考情分析!

中央民族大学&#xff08;Minzu University of China&#xff09;坐落于北京市学府林立的海淀区&#xff0c;南邻国家图书馆&#xff0c;北依中关村科技园&#xff0c;校园环境典雅&#xff0c;古朴幽美&#xff0c;人文氛围浓郁&#xff0c;具有鲜明的民族特色。由北京市、国家…

Java--初识类和对象

前言 本篇讲解Java类和对象的入门版本。 学习目的&#xff1a; 1.理解什么是类和对象。 2.引入面向对象程序设计的概念 3.学会如何定义类和创建对象。 4.理解this引用。 5.了解构造方法的概念并学会使用 考虑到篇幅过长问题&#xff0c;作者决定分多次发布。 面向对象的引入 J…

GAME101-Lecture07学习

前言 今天主要讲shading&#xff08;着色&#xff09;。在讲着色前&#xff0c;要先讲图形中三角形出现遮挡问题的方法&#xff08;深度缓存或缓冲&#xff09;。 先采样再模糊错误&#xff1a;对信号的频谱进行翻译&#xff08;在这期间会有频谱的混叠&#xff09;&#xff…

Anaconda安装-超详细版(2024)

扫盲&#xff1a;先装Python还是先装anaconda? 安装anaconda即可&#xff0c;不需要单独装python anaconda 是一个python的发行版&#xff0c;包括了python和很多常见的软件库, 和一个包管理器conda。 一、下载Anaconda 安装包&#xff08;官网和国内镜像资源&#xff09; …

【强化学习】DQN类算法的一些理解

一、DQN算法为什么要使用两个网络&#xff1f; DQN算法通常包含两个网络&#xff1a;一个是评估网络training_network&#xff0c;另一个是目标网络target_network。这两个网络的结构和初始权重是相同的&#xff0c;但它们的权重是不同步更新的。使用两个网络的原因是为了稳定…

vue3.0+antdv的admin管理系统vue-admin-beautiful推荐

前言 几年前&#xff0c;笔者自学了vue这一优秀的前端框架&#xff0c;但苦于没项目练手&#xff0c;无意间发现了vue-admin-beautiful这一优秀的前端集成框架。当时就使用它做了一很有意思的小项目---终端监控云平台&#xff0c;实现了前端和后台的整体功能。整体方案介绍参见…

洛谷P1364 医院设置

P1364 医院设置 题目描述 设有一棵二叉树&#xff0c;如图&#xff1a; 其中&#xff0c;圈中的数字表示结点中居民的人口。圈边上数字表示结点编号&#xff0c;现在要求在某个结点上建立一个医院&#xff0c;使所有居民所走的路程之和为最小&#xff0c;同时约定&#xff0c…

文件存储解决方案-阿里云OSS

文章目录 1.菜单分级显示问题1.问题引出1.苹果灯&#xff0c;放到节能灯下面也就是id大于1272.查看菜单&#xff0c;并没有出现苹果灯3.放到灯具下面id42&#xff0c;就可以显示 2.问题分析和解决1.判断可能出现问题的位置2.找到递归返回树形菜单数据的位置3.这里出现问题的原因…

一文读懂云渲染与离线渲染的关系是什么

云渲染和离线渲染是什么关系呢&#xff1f;在渲染过程中经常会有人听到云渲染、离线渲染&#xff0c;然而两者的关系却有很多人都不清楚&#xff0c;下面一起来简单看看两者之间的关系吧。 1、渲染目的和过程&#xff1a; - 离线渲染&#xff1a;通常用于创建高质量的静态图像…

每日复盘-20240515

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 国联证券 (1)|[9:25]|[133765万]|31.12 一…

单位个人怎样向报社的报纸投稿?

作为一名单位的信息宣传员,我肩负着每月定期在媒体上投稿发表文章的重任。然而,在投稿的道路上,我经历了不少波折和挫折。 一开始,我天真地以为只要将稿件发送到报社的投稿邮箱,就能轻松完成任务。然而,现实却远比我想象的复杂。邮箱投稿的竞争异常激烈,编辑们会在众多稿件中挑…

【35分钟掌握金融风控策略28】贷中模型体系策略应用

目录 贷中模型体系策略应用 信用模型体系和模型在策略中的应用 反欺诈模型体系和模型在策略中的应用 运营模型体系和模型在策略中的应用 贷中模型体系策略应用 在贷前模型部分已经讲过&#xff0c;贷前开发的很多模型是可以在贷中直接使用的。贷中与贷前的不同点在于&…