LeetCode:经典题之1491、896 题解与延伸
系列目录
88.合并两个有序数组
52.螺旋数组
567.字符串的排列
643.子数组最大平均数
150.逆波兰表达式
61.旋转链表
160.相交链表
83.删除排序链表中的重复元素
389.找不同
1491.去掉最低工资和最高工资后的工资平均值
896.单调序列
206.反转链表
92.反转链表II
141.环形链表
142.环型链表
目录
- 系列目录
- 1491. 去掉最低工资和最高工资后的工资平均值
- 方法一
- 方法二
- 896. 单调数列
- 方法一
- 方法二
- STL库
1491. 去掉最低工资和最高工资后的工资平均值
🌟数组+数学
原题链接
C++
若未特殊标明,以下题解均写用C++
- 在C++20之前,如果你想实现一个
reduce函数,可以编写或使用第三方库(如:Boost、STL的扩展) - 下面是一个简单的
reduce函数的实现,它使用std::accumulate算法来累加容器中的元素:
#include <numeric> // for std::accumulate
#include <vector> template<typename T, typename Iter>
T reduce(Iter begin, Iter end) { return std::accumulate(begin, end, T());
} int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; int sum = reduce(vec.begin(), vec.end()); // sum will be 15 return 0;
}
- 在C++中,
ranges::min()函数是C++20引入的一个标准库函数,用于在一个范围内找到最小值
示例:
#include <iostream>
#include <vector>
#include <ranges>using namespace std;int main() { vector<int> v = {4, 2, 9, 3, 5}; // 使用ranges::min查找并打印最小元素 auto min_value = ranges::min(v); cout << "The minimum value is: " << min_value << '\n'; // 你也可以使用begin()和end()迭代器 auto min_value_iter = ranges::min(v.begin(), v.end()); cout << "The iterator to the minimum value is: " << distance(v.begin(), min_value_iter) << '\n'; return 0;
}
方法一
auto+ranges::minmax
// 这里的 minmax不能颠倒
class Solution {
public:double average(vector<int>& salary) {int s = reduce(salary.begin(), salary.end()); auto [m, M] = ranges::minmax(salary);// 注意这里的doublereturn (double) (s - m - M) / (salary.size() - 2); }
};
方法二
模拟
class Solution {
public:double average(vector<int>& salary) {sort(salary.begin(), salary.end());int n = salary.size();// 注意这里是浮点数double sum = 0; // 这里n的上限为n-2,n-2-1+1=n-2for (int i = 1; i < n - 1; i ++) sum += salary[i];return sum / (n - 2);}
};
小试牛刀,再一起看看下面这道题吧~
896. 单调数列
🌟数组+数学
原题链接
方法一
class Solution {
public:bool isMonotonic(vector<int>& nums) {bool is_increase = true, is_decrease = true;int n = nums.size();// 为什么这里是 n-1而不是n——有i+1for (int i = 0; i < n - 1; i ++) { if (nums[i] < nums[i + 1])is_decrease = false;if (nums[i] > nums[i + 1])is_increase = false; }// 或运算——与之对应的且运算——&&return is_increase || is_decrease;}
};
is_sorted()函数
本身不会像sort函数一样,对数组进行排序,只判断是否已经是升序排序
rbegin()函数
c.begin() 返回一个迭代器,它指向容器c的第一个元素
c.end() 返回一个迭代器,它指向容器c的最后一个元素的下一个位置
c.rbegin() 返回一个逆序迭代器,它指向容器c的最后一个元素
c.rend() 返回一个逆序迭代器,它指向容器c的第一个元素前面的位置

在C++中,rbegin()是一个成员函数,用于获取指向容器( 如vector、list、deque、array等)最后一个元素的反向迭代器
反向迭代器是一种特殊的迭代器,它按照与正常迭代器相反的方向遍历容器
当你调用rbegin()时,它返回一个指向容器最后一个元素的反向迭代器
这意味着当你使用++操作符递增这个反向迭代器时,它实际上会向前移动到容器的上一个元素,而不是向后 同样,当你使用--操作符递减反向迭代器时,它会向后移动到容器的下一个元素
示例:
#include <iostream>
#include <vector>using namespaceint main() { vector<int> v = {1, 2, 3, 4, 5}; // 使用rbegin()获取指向容器最后一个元素的反向迭代器 auto rit = v.rbegin(); // 使用反向迭代器遍历容器 for (; rit != v.rend(); rit ++) { cout << *rit << ' '; // 输出:5 4 3 2 1 } cout << '\n'; return 0;
}
在这个示例中,我们创建了一个包含五个整数的vector 然后,我们使用rbegin()获取一个指向容器最后一个元素的反向迭代器,并使用这个迭代器遍历容器,从后向前输出元素
注意,我们使用v.rend()作为循环的结束条件,rend()返回一个表示反向迭代器“尾后”位置的反向迭代器
方法二
// 两次遍历——“检查”🧐
// 调用STL库里的 is_sorted()函数 检查向量是否为升序或降序排列
class Solution {
public:bool isMonotonic(vector<int>& nums) {return is_sorted(nums.begin(), nums.end()) || is_sorted(nums.rbegin(), nums.rend());}
};
STL库
在C++中,**STL(Standard Template Library,标准模板库)**是一个包含大量通用模板类和函数的库,这些模板类和函数用于处理各种常见的数据结构和算法STL是C++标准库的一部分,由ISO C++标准委员会制定,并包含在其中
STL的设计理念是“泛型编程”(generic programming),即编写可以处理多种数据类型的代码通过使用模板和迭代器,STL能够实现这种泛型编程的目标,使得C++代码更加灵活、可重用和易于维护
STL的应用:
- 提供大量的容器(containers),如
vector、list、deque(双端队列)、set、map等,用于存储和管理数据这些容器类都是模板类,可以存储任何类型的数据(只要该类型支持必要的操作,如:拷贝和赋值) - 包含一系列算法(algorithms),用于处理存储在容器中的数据这些算法包括排序、查找、复制、替换等STL的算法都是高度通用的,并且不依赖于特定的数据结构,因此可以应用于任何支持STL迭代器(iterator)的容器
- 包含一些迭代器(iterator),用于遍历和访问容器中的元素迭代器是一种设计模式,它提供了一种方法,用于遍历容器中的数据,而无需了解容器的底层实现细节STL的迭代器分为五类:输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器
相关文章:
LeetCode:经典题之1491、896 题解与延伸
系列目录 88.合并两个有序数组 52.螺旋数组 567.字符串的排列 643.子数组最大平均数 150.逆波兰表达式 61.旋转链表 160.相交链表 83.删除排序链表中的重复元素 389.找不同 1491.去掉最低工资和最高工资后的工资平均值 896.单调序列 206.反转链表 92.反转链表II 141.环形链表 …...
2024三掌柜赠书活动第二十五期:Rust 游戏开发实战
目录 目录 前言 Rust语言概念 关于《Rust 游戏开发实战》 Rust系统编程的核心点 Rust开发的关键技术和工具 内容简介 作者简介 书中前言/序言 内容介绍 《Rust 游戏开发实战》全书速览 图书目录 结束语 前言 技术圈最近的编程语言新秀当属Rust莫属,Rus…...
基于Java蛋糕甜品商城系统设计和实现(源码+LW+调试文档+讲解等)
💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟感兴趣的可以先收藏起来,还…...
Tomcat get请求传数组集合参数
前言 最近做项目,需要通过GET传参,来实现查询的能力,本来是RPC调用,直接参数序列化即可。但是服务最近修改为HTTP,本来Spring Cloud的feign也可以直接传参数,但是当使用Nginx访问时参数到底传啥呢…...
信息学奥赛初赛天天练-34-CSP-J2021完善程序-按位异或、模拟算法、数组模拟环、约瑟夫问题应用
PDF文档公众号回复关键字:20240624 2021 CSP-J 完善程序3 1 完善程序 (单选题 ,每小题3分,共30分) (Josephus问题)有n个人围成一个圈,依次标号0至n-1。从0号开始,依次 0,1,0&#…...
【计算机视觉】人脸算法之图像处理基础知识(六)
图像直方图 图像直方图是描述图像中像素强度分布的一种统计图表,它是图像处理和计算机视觉领域中一个非常基础且重要的概念。图像直方图通常用于分析图像的亮度、对比度特性,以及在图像增强、阈值分割、特征提取等多种图像处理任务。 import cv2 impor…...
仓颉编程语言入门
华为在 2024 年 6 月 21 日的华为开发者大会上,华为终端 BG 软件部总裁龚体正式官宣了华为自研仓颉编程语言,并发布了 HarmonyOS NEXT 仓颉语言开发者预览版。 仓颉编程语言文件后缀名为 .cj, 以下是第一个入门代码输出:你好,仓颉…...
在前端项目中,如何处理错误和异常?
在前端项目中,如何处理错误和异常? 在前端项目中,处理错误和异常是至关重要的,它能确保应用程序的稳定性和用户体验。以下是一些常见的方法: try-catch-finally结构:使用JavaScript的try/catch块来捕获并…...
Ubuntu系统下修改网卡IP地址
Ubuntu系统下修改网卡IP地址 一、Ubuntu系统介绍1.1 Ubuntu简介1.2 Ubuntu网络配置方式 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本 四、配置网卡IP地址4.1 备份网卡配置文件4.2 查看当前IP地址4.3 修改…...
Scrapy如何对爬虫数据进行清洗和处理?
爬虫数据处理是数据采集应用中至关重要的一步。scrapy是一种流行的python爬虫框架,可以帮助我们快速高效地从网页中提取所需信息。但是,我们经常面临的一个问题是数据的质量低劣,存在各种噪声和错误,这使得它们难以用于后续分析和…...
Linux:基础IO(三.软硬链接、动态库和静态库、动精态库的制作和加载)
上次介绍了基础IO(二):Linux:基础IO(二.缓冲区、模拟一下缓冲区、详细讲解文件系统) 文章目录 1.软硬链接1.1硬链接1.2软链接使用场景 2.动态库和静态库1.1回顾1.2静态库的制作和使用为什么要有库制作者角度…...
低价可转债崩盘,发生了什么?
下跌不在于“出库”,甚至不在于“风险”。问题更多在于交易层面,何时能积聚更多的左侧资金并成功过渡至右侧。 低价券怎么了? 如果说6月初主要是小微盘品种的退市风险,后来是一些评级下调的品种,到本周,已…...
【面试题】马上金九银十了,简历该准备起来了,面试题你准备好了吗 ?浅谈 JS 浅拷贝和深拷贝
代码展示 let obj_old {name: Tom,age: 15,favorite: {food: bread,drink: milk} } let obj_new {...obj_old} console.log(obj_old obj_new) // false console.log(obj_old.name obj_new.name) // true console.log(obj_old.favorite obj_new.favorite) // true3. Ar…...
最新OPPO 真我手机 一加手机 使用adb命令永久关闭系统更新教程
使用adb命令永久关闭系统更新 一、先了解手机系统二、Android 11 以下使用adb 命令永久关闭系统更新1、adb 官方下载2、小白开启 USB 调试模式教程(熟手跳过)三、Android 12 以上使用adb 命令永久关闭系统更新什么您还是不会弄!赞赏我&#x…...
OnlyOffice:现代办公的最佳选择
目录 安装 使用 评价 对比(与WPS) 总结 在当今的数字化办公时代,选择一款功能全面且易于使用的办公软件至关重要。OnlyOffice作为一款现代化的办公软件,凭借其强大的功能和友好的用户体验,逐渐成为了众多企业和个…...
【收藏】2024年必备相图数据库资源集锦!
在材料化工领域,相图不仅仅是一个简单的图表,它是一个强大的工具,为材料科学家和工程师提供了深入理解材料行为的窗口。从选择合金元素及其比例的初步阶段,到后续的加工方法选择和热处理工艺的确定,相图都扮演着至关重…...
Zookeeper 二、Zookeeper环境搭建
Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式 单机模式:Zookeeper只运行在一台服务器上,适合测试环境集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”…...
Web3 学习
之前学习 web3,走了不少弯路,最近看到了 hackquest,重新刷了一遍以太坊基础,感觉非常nice,而且完全免费,有需要的可以试试,链接hackquest.io。...
Grafana+Prometheus(InfluxDB)+Jmeter使用Nginx代理搭建可视化性能测试监控平台
前言 在这篇博客文章中,将分享JMeter > Prometheus(InfluxDB) > Grafana的集成,以及Nginx端口反向代理各服务的端口。 背景 在JMeter插件库中,有一些后端监听器可供Kafka、ElasticSearch和Azure使用。默认情况下,JMeter支…...
web学习笔记(六十六)项目总结
目录 1. Suspense标签 2.发布订阅者模式 3.pinia的使用 4.在请求过来的数据添数据 5.设置token和取token 6. 实现触底加载 7.导航守卫判断登录状态。 1. Suspense标签 Suspense主要用于用于处理异步组件加载和数据获取。,使用这个标签可以允许你在组件等待数…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
