剑指offer32-42字符串数组的应用

news/2024/5/6 9:06:02/文章来源:https://blog.csdn.net/baidu_41553551/article/details/126655873

剑指 Offer II 032. 有效的变位词

给定两个字符串 s 和 t ,编写一个函数来判断它们是不是一组变位词(字母异位词)。t 是 s的变位词等价于「两个字符串不相等且两个字符串排序后相等」

注意:若 s 和 t 中每个字符出现的次数都相同且字符顺序不完全相同,则称 s 和 t 互为变位词(字母异位词)。
在这里插入图片描述
也就字母个数一样,就是顺序不一样

方法一:先排序再判断

在这里插入图片描述

方法二:哈希表

剑指 Offer II 033. 变位词组

给定一个字符串数组 strs ,将 变位词 组合在一起。 可以按任意顺序返回结果列表。

注意:若两个字符串中每个字符出现的次数都相同,则称它们互为变位词。
在这里插入图片描述

方法一:将排序后的值为键,将当前元素为值

字母异位词的两次词排序后的值是一样的,将这个值作为键,将排序前的值加入到键后的哈希表中
在这里插入图片描述
在这里插入图片描述

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string, vector<string>> mp;for (string& str : strs) {string key = str;std::sort(key.begin(), key.end());mp[key].emplace_back(str);}vector<vector<string>> ans;for (auto it = mp.begin(); it != mp.end(); ++it) {ans.emplace_back(it->second);}return ans;}
};

剑指 Offer II 034. 外星语言是否排序

某种外星语也使用英文小写字母,但可能顺序 order 不同。字母表的顺序(order)是一些小写字母的排列。

给定一组用外星语书写的单词 words,以及其字母表的顺序 order,只有当给定的单词在这种外星语中按字典序排列时,返回 true;否则,返回 false。
在这里插入图片描述

题目的意思是外星人的字母表和地球人的不一样,所以单词排序要按其他的字母表排序
比如apple和book,外星人字母表可能是先b后a,所以正常排序应该是book,apple。另外需要注意一点的是boos和books,books要大于book

方法一:直接遍历

首先对外星人字母表进行处理,依旧是用字母-'a’得到下标,然后下标对应的值为它的顺序
在这里插入图片描述
然后对两个字母公共的部分进行判断,
为了防止越界,让i从1开始,和0位置作比较,i最终结束条件为 words.size()
对于两个单词长度不一样的情况,只比较到长度小的长度。apples和book只比较到4
如果出现当前位置两个元素,后一个单词的元素大于当前元素,那么跳出循环,比如book和baok,a大于o,那么就对了,这两个单词就不用比较了,如果小于,那么直接返回false
在比较完两个单词后,还要看两个公共长度外的,长度大的是大的
在这里插入图片描述

class Solution {
public:bool isAlienSorted(vector<string>& words, string order) {vector<int> index(26);for (int i = 0; i < order.size(); i++) {index[order[i] - 'a'] = i;}for (int i = 1; i < words.size(); i++) {bool valid = false;for (int j = 0; j < words[i - 1].size() && j < words[i].size(); j++) {int prev = index[words[i - 1][j] - 'a'];int curr = index[words[i][j] - 'a'];if (prev < curr) {valid = true;break;}else if (prev > curr) {return false;}}if (!valid) {/* 比较两个字符串的长度 */if (words[i - 1].size() > words[i].size()) {return false;}}}return true;}
};

剑指 Offer II 035. 最小时间差

给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
在这里插入图片描述
在这里插入图片描述
是时间的时间差,而不是某个项的时间差

方法:先排序,比较的时候将字符串转换为类似时间戳形式,用打擂得出最小值

对于首位的时间差可以通过往数组里加入一个首元素+24*60的形式
也可以到最后判断
在这里插入图片描述

class Solution {int getMinutes(string& t) {return (int(t[0] - '0') * 10 + int(t[1] - '0')) * 60 + int(t[3] - '0') * 10 + int(t[4] - '0');}public:int findMinDifference(vector<string>& timePoints) {int n = timePoints.size();if (n > 1440) {return 0;}sort(timePoints.begin(), timePoints.end());int ans = INT_MAX;int t0Minutes = getMinutes(timePoints[0]);int preMinutes = t0Minutes;for (int i = 1; i < n; ++i) {int minutes = getMinutes(timePoints[i]);ans = min(ans, minutes - preMinutes); // 相邻时间的时间差preMinutes = minutes;}ans = min(ans, t0Minutes + 1440 - preMinutes); // 首尾时间的时间差return ans;}
};

剑指 Offer II 036. 后缀表达式

在这里插入图片描述
题目的意思就是求后缀表达式运算的结果

方法一:利用栈

不管哪个符号都是双目运算的,也就是碰见一个符号,一定是对前两个元素操作。
比如 a b * 一定是对a和b进行运算,而2 1 + 3 看结果是有括号也是要2和1运算完成后再与3进行乘,所以不需要顾忌
对于判断不是数字可以通过 !(token == “+” || token == “-” || token == "
" || token == “/”);或者直接通过isdigit()方法在这里插入图片描述

class Solution {
public:int evalRPN(vector<string>& tokens) {stack<int> stk;int n = tokens.size();for (int i = 0; i < n; i++) {string& token = tokens[i];if (isNumber(token)) {stk.push(atoi(token.c_str()));}else {int num2 = stk.top();stk.pop();int num1 = stk.top();stk.pop();switch (token[0]) {case '+':stk.push(num1 + num2);break;case '-':stk.push(num1 - num2);break;case '*':stk.push(num1 * num2);break;case '/':stk.push(num1 / num2);break;}}}return stk.top();}bool isNumber(string& token) {return !(token == "+" || token == "-" || token == "*" || token == "/");}
};

方法二:数组模拟栈

后缀表达式中数字的个数一定比运算符多一个,然后后缀表达式一定是奇数。如果后缀表达式有n个字符,那么数字的个数一定是(n+1)/2,操作符的个数一定是(n-1)/2,在申请空间时,最坏情况下,操作数都在前面,在其他情况下每遇见一个操作符就会减少一个数字,所以最坏情况下需要申请空间为(n+1)/2
在这里插入图片描述

剑指 Offer II 037. 小行星碰撞

给定一个整数数组 asteroids,表示在同一行的小行星。

对于数组中的每一个元素,其绝对值表示小行星的大小,正负表示小行星的移动方向(正表示向右移动,负表示向左移动)。每一颗小行星以相同的速度移动。

找出碰撞后剩下的所有小行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。

输入:asteroids = [5,10,-5]
输出:[5,10]
解释:10 和 -5 碰撞后只剩下 10 。 5 和 10 永远不会发生碰撞。

题目的正是指向右移动,负是指向左移动,正负符号后面的数字只是指行星的大小,并不是移动距离

分析:题目碰撞只可能是左正右负,如果是左负右正即一个往左跑,一个往右跑是不可能碰撞,而左负右负也不可能发生碰撞。因此只能是左正右负会发生碰撞。

可以用栈,也可以用数组,这里用数组处理

方法:用数组模拟栈

在这里插入图片描述

代码

class Solution {
public:vector<int> asteroidCollision(vector<int>& asteroids) {// 栈应用题vector<int> s;for (int c : asteroids) {while (!s.empty() && s.back() > 0 && c < 0) {  // 碰撞条件:左正右负int a = s.back(), b = abs(c); // 根据规则,查看c的绝对质量s.pop_back();if (a > b) c = a;  // 左球大于右球,右球被吃else if (a < b) continue; // 右球大于左球,继续去给我往左碰else c = 0;  // 质量一样两者消失}// 如果最终不是两者消失的情况,那么要把一顿乱撞后剩余的球入栈// 同时下边的条件正好也把质量为0的球忽略掉了,这种球没有用if (c != 0) s.push_back(c);}return s;}

剑指 Offer II 038. 每日温度

请根据每日 气温 列表 temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。
在这里插入图片描述
题目的意思是找比当前元素大的第一个元素的间隔,如果后面没有了那么就写0

方法一:暴力法

方法二:单调栈

后面出现较大的值会吃掉前面较小的值,直到第一个不比其自身小的值为止
在这里插入图片描述
在这里插入图片描述

代码

class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {int n = temperatures.size();vector<int> ans(n);stack<int> s;for (int i = 0; i < n; ++i) {while (!s.empty() && temperatures[i] > temperatures[s.top()]) {int previousIndex = s.top();ans[previousIndex] = i - previousIndex;s.pop();}s.push(i);}return ans;}
};

剑指 Offer II 039. 直方图最大矩形面积

给定非负整数数组 heights ,数组中的数字用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。
在这里插入图片描述
在这里插入图片描述
题目意思就是求这些图形能勾勒出的最大面积,这个面积可能是多个矩形的公共部分,也可以直接是自己的面积

枚举法(时间复杂度为O(n^2)会超时)

枚举宽

两层for循环,第一层枚举左边界,第二层枚举右边界,在循环里面,每次循环都更新高的值,高的值为min(原先最小值,新建入右边界后的值)
在这里插入图片描述

代码

class Solution {
public:int largestRectangleArea(vector<int>& heights) {int n = heights.size();int ans = 0;// 枚举左边界for (int left = 0; left < n; ++left) {int minHeight = INT_MAX;// 枚举右边界for (int right = left; right < n; ++right) {// 确定高度minHeight = min(minHeight, heights[right]);// 计算面积ans = max(ans, (right - left + 1) * minHeight);}}return ans;}
};

枚举高

for循环每个柱子,这样就先确定矩形的高了,接下来从柱子开始先向左延伸再向右延伸,一旦碰到高度比柱子矮的柱子就停止延伸。
在这里插入图片描述

代码

class Solution {
public:int largestRectangleArea(vector<int>& heights) {int n = heights.size();int ans = 0;for (int mid = 0; mid < n; ++mid) {// 枚举高int height = heights[mid];int left = mid, right = mid;// 确定左右边界while (left - 1 >= 0 && heights[left - 1] >= height) {--left;}while (right + 1 < n && heights[right + 1] >= height) {++right;}// 计算面积ans = max(ans, (right - left + 1) * height);}return ans;}
};

方法一:单调栈

维护一个严格单调递增的栈,

在这里插入图片描述
在这里插入图片描述

代码

class Solution1 {
public:int largestRectangleArea(vector<int>& heights) {int n = heights.size();vector<int> left(n), right(n, n);stack<int> mono_stack;for (int i = 0; i < n; ++i) {while (!mono_stack.empty() && heights[mono_stack.top()] >= heights[i]) {right[mono_stack.top()] = i;mono_stack.pop();}left[i] = (mono_stack.empty() ? -1 : mono_stack.top());mono_stack.push(i);}int ans = 0;for (int i = 0; i < n; ++i) {ans = max(ans, (right[i] - left[i] - 1) * heights[i]);}return ans;}
};

剑指 Offer II 040. 矩阵中最大的矩形

给定一个由 0 和 1 组成的矩阵 matrix ,找出只包含 1 的最大矩形,并返回其面积。

注意:此题 matrix 输入格式为一维 01 字符串数组。
在这里插入图片描述

方法一:暴力法

两个for循环枚举左上角和右下角,但是复杂度过高

方法二:使用柱状图的优化暴力方法

求矩阵面积也就是求每行的直方图,如下图所示,每行都标出了它的高度,
以第三行为例 3 1 3 2 2就直接变成了上题的求面积的问题,因此这个题目可以抽象成求四行元素的直方图。
在这里插入图片描述
在这里插入图片描述

代码

class Solution {
public:int maximalRectangle(vector<string>& matrix) {if (matrix.size() == 0) {return 0;}vector<int> heights(matrix[0].size(), 0);int maxArea = 0;for (int i = 0; i < matrix.size(); ++i) {for (int j = 0; j < matrix[0].size(); ++j) {if (matrix[i][j] == '0') {heights[j] = 0;}else {heights[j] += matrix[i][j] - '0';}}maxArea = max(maxArea, largestRectangleArea(heights));}return maxArea;}int largestRectangleArea(vector<int>& heights) {stack<int> sta;sta.push(-1);int maxArea = 0;for (int i = 0; i < heights.size(); ++i) {while (sta.top() != -1 && heights[sta.top()] >= heights[i]) {int height = heights[sta.top()];sta.pop();int width = i - sta.top() - 1;maxArea = max(maxArea, height * width);}sta.push(i);}while (sta.top() != -1) {int height = heights[sta.top()];sta.pop();int width = heights.size() - sta.top() - 1;maxArea = max(maxArea, height * width);}return maxArea;}
};

剑指 Offer II 041. 滑动窗口的平均值

在这里插入图片描述
在这里插入图片描述

用一个sum变量维护窗口的值

用一个sum变量维护窗口的值,当窗口值的数量小于窗口的最大的大小时一直往里加
在这里插入图片描述

剑指 Offer II 042. 最近请求次数

写一个 RecentCounter 类来计算特定时间范围内最近的请求。

请实现 RecentCounter 类:

RecentCounter() 初始化计数器,请求数为 0 。
int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。
保证 每次对 ping 的调用都使用比之前更大的 t 值。
在这里插入图片描述

用队列存放请求时间

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

QT QTextEdit富文本插入字体-表格-编号-图片-查找-语法高亮功能

QT QTextEdit富文本插入字体-表格-编号-图片与查找功能&#xff0c;输入char 自动变成蓝色-语法高亮功能 QTQTextEdit富文本插入字体-表格-编号-图片-查找-语法高亮功能.rar-QT文档类资源-CSDN下载QTQTextEdit富文本插入字体-表格-编号-图片-查找-语法高亮功能.rarhttps:/更多…

Vue使用脚手架(ref、props、mixin、插件、scoped)(七)

系列文章目录 第一章&#xff1a;Vue基础知识笔记&#xff08;模板语法、数据绑定、事件处理、计算属性&#xff09;&#xff08;一&#xff09; 第二章&#xff1a;Vue基础知识&#xff08;计算属性、监视属性、computed和watch之间的区别、绑定样式&#xff09;&#xff08;…

四、 java的对象和类

四、 java的对象和类 对象&#xff08;Object&#xff09;&#xff1a;对象是类的一个实例&#xff0c;有状态和行为。例如&#xff0c;一条狗是一个对象&#xff0c;它的状态有&#xff1a;颜色、名字、品种&#xff1b;行为有&#xff1a;摇尾巴、叫、吃等。类&#xff08;c…

物理服务器安装CentOS 7操作系统

目录 1、下载系统镜像 2、制作安装盘 2.1 方法一&#xff1a;光盘制作 2.2 方法二&#xff1a;U盘制作 3、更改bios启动顺序 4、安装CentOS 7操作系统 4.1 安装命令选择&#xff0c;及常见错误解决 4.2 语言选择 4.3 时区选择 4.4 软件选择 4.5 安装位置选择 4.6 手…

猿创征文|【C++游戏引擎Easy2D】学C++还不会绘制一个简单的二维图形?一篇文章教会你

&#x1f9db;‍♂️iecne个人主页&#xff1a;&#xff1a;iecne的学习日志 &#x1f4a1;每天关注iecne的作品&#xff0c;一起进步 &#x1f4aa;学C必看iecne 本文专栏&#xff1a;【C游戏引擎】. &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; ✨前…

Apache Maven 3.6.0的下载安装和环境配置(详细图解+不限速下载链接)

标题工具/原料 apache-maven-3.6.0 下载地址 云盘不限速下载 或者进入官网按下图下载 方法/步骤一 安装 打开压缩包&#xff0c;将maven压缩包解压至软件安装处&#xff0c;建议D根目录或其他&#xff0c;记住安装位置 类似于 方法/步骤二 环境变量配置 变量 1.新建变…

Eolink 通过可信云权威认证,数据保护能力业内领先!

Eolink 正式通过由中国信息通信研究院组织发起的可信云评估考核&#xff0c;在数据安全保障领域获得权威认证&#xff0c;并荣获 “企业级 SaaS 服务” 认证证书。 在云时代&#xff0c;保护用户数据安全、预防隐私泄露是数字化企服厂商的重中之重。Eolink 作为一个 API 在线管…

计算机毕业设计ssm+vue基本微信小程序的个人健康管理系统

项目介绍 首先,论文一开始便是清楚的论述了小程序的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了小程序的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数…

IIC协议详解

文章目录1 IIC简介2 IIC物理层2.1 IIC硬件2.2 IIC协议特点3 IIC协议层4数据传输4.1 IIC写数据4.2 IIC读数据1 IIC简介 IIC(Inter&#xff0d;Integrated Circuit)总线是一种由 NXP&#xff08;原 PHILIPS&#xff09;公司开发的两线式串行总线&#xff0c; 用于连接微控制器及其…

s19.基于 Kubernetes v1.25.0(kubeadm) 和 Docker 部署高可用集群(一)

基于 Kubernetes v1.25.0 和 Docker 部署高可用集群 主要内容 Kubernetes 集群架构组成容器运行时 CRIKubernetes v1.25 新特性Kubernetes v1.24 之后不再支持 Docker 的解决方案Kubernetes v1.25 高可用集群架构基于 Kubernetes v1.25.0 和 Docker 部署高可用集群实战案例 …

Redis持久化机制分析

什么是持久化&#xff1f; 简单来说持久化就是将数据保存到磁盘&#xff0c;让即使服务宕机、重启、断电等操作后数据仍热存在&#xff0c;并且是完整的。 1、为什么要持久化&#xff1f; 1、Redis是一个内存数据库&#xff0c;宕机之后存储在内存的数据会消失。2、Redis重启…

传述最详细的干货,让简历面试不再成为你找工作的绊脚石

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

【蓝桥杯省赛真题37】Scratch三国演义字数统计 少儿编程scratch编程蓝桥杯省赛真题讲解

​​​​​​​ 目录 scratch三国演义字数统计 一、题目要求 编程实现 二、案例分析 1、角色分析

Linux内核设计与实现 第三章 进程管理

3.1进程 实际上&#xff0c;进程就是正在执行的程序代码的实时结果。 进程是出于执行期的程序以及相关的资源的总称。 进程的另一个名字是任务。 进程不仅仅局限于一段可执行程序代码通常进程还要包含其他资源&#xff0c;像打开的文件&#xff0c;挂起的信号&#xff0c;内核…

springboot项目整理(持续更新)

SpringSecurity 1.导入依赖&#xff1a; 在pom.xml中导入依赖&#xff0c;再访问页面就会出现login&#xff0c;这是SpringSecurity自己写的页面&#xff0c;用于登录认证 <dependency><groupId>org.springframework.boot</groupId><artifactId>spr…

整合流量与资源的分享购商业模式,实现整个生态布局

大多数企业都很容易忽视一个市场&#xff0c;就是我们的日常生活服务板块&#xff0c;所谓民以食为天&#xff0c;我们应该顺应人们的生活习惯而做出来的电商商业模式&#xff0c;才是最贴合民心的&#xff0c;也能够从用户的最基础的需求出发来为其打造商业模式。 将目标放在生…

Room (三) RecyclerView 呈现列表数据

1. 用到的组件 Room&#xff0c;ViewModel&#xff0c;LiveData&#xff0c;Repository&#xff0c;AsyncTack 2. Module 中 build.gradle 文件中添加 dependencies {def room_version "2.4.3"implementation "androidx.room:room-runtime:$room_version&quo…

【Linux操作系统】-- 多线程(三)-- 线程池+单例模式

目录 线程池 场景 代码实现 线程安全的单例模式 懒汉实现方式和懒汉实现方式 饿汉方式实现单例模式 懒汉方式实现单例模式 实战代码演练单例模式 线程池 在C中用户使用new/malloc都是向操作系统OS申请的&#xff0c;在系统的角度&#xff0c;就相当于new/malloc在底层封…

MySQL之临时表

写在前面 本文一起看下MySQL的临时表。 1&#xff1a;什么是临时表 通过create temporary table t语句创建的表&#xff0c;就是临时表&#xff0c;临时表的临时体现在其是其生命周期是和会话一样的&#xff0c;当会话结束&#xff0c;即连接关闭时MySQL会自动将创建的临时表…

氨丙基咪唑离子液体(AMIBr)改性纤维素气凝胶吸附剂(CAgAMIBr)的实验要求

氨丙基咪唑离子液体(AMIBr)改性纤维素气凝胶吸附剂(CAgAMIBr)的实验要求 离子液体(ILs)&#xff0c;是完全由离子组成的液体&#xff0c;可以进一步定义为熔点低于100C的熔盐。 离子液体是在室温或接近室温下可呈现液体的液态有机盐。离子液体因具有一些优良的特性使其在分离…