每日练习——leetcode1047和239

目录

1047. 删除字符串中的所有相邻重复项

题目描述

解题思路

代码实现

239. 滑动窗口最大值

题目描述

解题思路

代码实现


1047. 删除字符串中的所有相邻重复项

题目描述

给出由小写字母组成的字符串 S重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

示例:

输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。

提示:

  1. 1 <= S.length <= 20000
  2. S 仅由小写英文字母组成。

解题思路

  1. 获取字符串长度并初始化栈
    • 首先,使用strlen函数获取输入字符串s的长度,并存储在变量len中。
    • 接着,为栈分配足够的内存空间(len + 1),其中额外的1个位置是为了存放字符串的结束符\0
    • 定义了一个变量stackTop来追踪栈顶的位置,初始时栈为空,所以stackTop设为0。
  2. 遍历字符串并处理相邻重复字符
    • 使用一个for循环来遍历输入字符串s中的每个字符。
    • 对于每个字符s[i],检查它是否与当前栈顶元素stack[stackTop - 1]相同。
    • 如果相同,说明出现了相邻的重复字符,将栈顶指针stackTop减1,以移除栈顶的重复字符。
    • 如果不同,或者栈为空(即stackTop为0),则将当前字符s[i]压入栈中,并递增栈顶指针stackTop
  3. 添加字符串结束符并返回结果
    • 遍历完整个字符串后,在栈中最后一个有效字符的位置(即stack[stackTop - 1]之后,即stack[stackTop])添加一个字符串结束符\0,这样stack就形成了一个合法的C字符串。
    • 最后,返回栈的地址,即处理后的字符串。

代码实现

char* removeDuplicates(char* s) {int len = strlen(s);char* stack =(char *)malloc(sizeof(char)*(len + 1));int stackTop = 0;for (int i = 0; i < len; i++) {if (stackTop > 0 && stack[stackTop - 1] == s[i]) {stackTop--;} else {stack[stackTop++] = s[i];}}stack[stackTop] = '\0';return stack;
}

239. 滑动窗口最大值

题目描述

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 

示例 1:

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       31 [3  -1  -3] 5  3  6  7       31  3 [-1  -3  5] 3  6  7       51  3  -1 [-3  5  3] 6  7       51  3  -1  -3 [5  3  6] 7       61  3  -1  -3  5 [3  6  7]      7

示例 2:

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

提示:

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

解题思路

  1. 定义变量
    • n:数组 nums 的长度。
    • queue:一个数组,用于模拟队列的操作,存储窗口内可能的最大值。
    • front 和 rear:分别表示队列的队首和队尾索引。
    • left 和 right:分别表示当前滑动窗口的左边界和右边界。
  2. 窗口右移
    • 遍历数组 nums,从 right = 0 开始,直到 right 达到数组末尾。
  3. 维护队列的单调性
    • 在每次窗口右移时,检查队列的队尾元素是否小于新元素 nums[right]。如果是,则不断从队尾弹出元素,直到队列为空或找到不小于 nums[right] 的元素。
    • 然后,将新元素 nums[right] 入队。
  4. 处理窗口大小大于 k 的情况
    • 当窗口的大小(right - left + 1)大于 k 时,说明窗口的左边界需要向右移动。
    • 如果队列的队首元素(即当前窗口的最大值)与 nums[left] 相等,则将队首元素出队,因为该元素已经不在窗口内了。
    • 否则,将 nums[left] 更新为队首元素,即当前窗口的最大值。
    • 然后,左边界 left 向右移动一位。
  5. 返回结果
    • 遍历完成后,滑动窗口已经遍历了整个数组 nums
    • nums 数组中的每个位置 left(即每个窗口的左边界)都存储了对应窗口的最大值。
    • 函数返回修改后的 nums 数组,并通过 returnSize 返回窗口的个数,即 n - k + 1

代码实现

/*** Note: The returned array must be malloced, assume caller calls free().*/
int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) {int n = numsSize; // n 为数组 nums 的长度  int queue[n];     // 队列,用于存储当前窗口内的元素索引  int front = 0, rear = -1; // 队首和队尾索引,分别指向队列的第一个和最后一个元素  int left = 0, right = 0;  // 窗口的左边界和右边界索引  // 当右边界没有达到数组末尾时,继续移动窗口  while (right < n) {  // 如果队列不为空且当前元素大于队列尾部的元素,则将队列尾部的元素出队  // 这样可以保证队列是单调递减的,即队首元素是当前窗口的最大值  while (rear >= front && nums[right] > nums[queue[rear]]) {  rear--;  }  // 将当前元素的索引入队  queue[++rear] = right;  // 右边界向右移动一位  right++;  // 当窗口大小大于 k 时,左边界需要向右移动  if (left + k <= right) {  // 如果队列的队首元素(即当前窗口的最大值)对应的索引等于左边界的索引  // 则说明这个最大值已经不在窗口内了,将其从队列中出队  if (queue[front] == left) {  front++;  }  // 将当前窗口的最大值(即队列的队首元素对应的值)存入原数组对应的位置  nums[left] = nums[queue[front]];  // 左边界向右移动一位  left++;  }  }  // 设置返回数组的大小为窗口的个数,即 n - k + 1  *returnSize = n - k + 1;  // 返回修改后的原数组,它现在包含了每个窗口的最大值  return nums;  
}

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

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

相关文章

棋盘(c++题解)

题目描述 有一个m m的棋盘&#xff0c;棋盘上每一个格子可能是红色、黄色或没有任何颜色的。你现在要从棋盘的最左上角走到棋盘的最右下角。 任何一个时刻&#xff0c;你所站在的位置必须是有颜色的&#xff08;不能是无色的&#xff09; &#xff0c;你只能向上、下、 左、右…

7 个适用于 Windows 的最佳电脑分区数据恢复软件

磁盘分区对于正确存储数据以便从硬盘驱动器快速轻松地访问非常有帮助。但是&#xff0c;如果分区损坏&#xff0c;存储在其中的所有数据都会突然变得无法访问。磁盘分区损坏的原因可能有很多&#xff0c;其中最突出的是病毒攻击、突然断电、物理损坏或由于创建坏扇区。 但是&a…

eNSP-抓包解析TCP三次握手和四次挥手的过程

一、环境搭建 1.设备连接 并 启动所有设备 2.服务器配置 3.客服端配置 二、抓包测试 1.打开抓包软件 2.客户端获取数据 三、抓包结果

深度学习体系结构——CNN, RNN, GAN, Transformers, Encoder-Decoder Architectures算法原理与应用

1. 卷积神经网络 卷积神经网络&#xff08;CNN&#xff09;是一种特别适用于处理具有网格结构的数据&#xff0c;如图像和视频的人工神经网络。可以将其视作一个由多层过滤器构成的系统&#xff0c;这些过滤器能够处理图像并从中提取出有助于进行预测的有意义特征。 设想你手…

Blender3.5 下载地址及安装教程

Blender是一款开源的3D计算机图形软件&#xff0c;广泛应用于动画制作、游戏开发、建模、渲染等领域。它提供了一套强大的工具和功能&#xff0c;让用户能够进行三维建模、动画制作和视觉效果的创作。 Blender支持多种文件格式的导入和导出&#xff0c;使用户能够与其他软件进…

无人机光伏电站巡检:技术革新与未来趋势

1.引言与背景 随着能源需求的日益增长&#xff0c;光伏电站开始走进千家万户。因为国内幅员辽阔且地形复杂&#xff0c;给电站的维护工作造成了很多困扰。如何让光伏电站的稳定运行变得至关重要。传统的巡检方法&#xff0c;如人工巡检&#xff0c;不仅效率低下&#xff0c;还…

Study Pyhton

PyCharm PyCharm是一个写python代码的软件&#xff0c;用PyCharm写代码比较方便。 PyCharm快捷键ctrl alt s打开软件设置ctrl d复制当前行代码 shift alt 上\下将当前行代码上移或下移crtl shift f10运行当前代码文件shiftf6重命名文件 ctrl a全选ctrl c\v\x复制、粘贴、…

[MAUI]集成富文本编辑器Editor.js至.NET MAUI Blazor项目

文章目录 获取资源从源码构建从CDN获取获取扩展插件 创建项目创建控件创建Blazor组件初始化保存销毁编写渲染逻辑 实现只读/编辑功能切换模式获取只读模式状态响应切换事件 实现明/暗主题切换项目地址 Editor.js 是一个基于 Web 的所见即所得富文本编辑器&#xff0c;它由CodeX…

红豆Cat 1开源|项目三: 从0-1设计一款HTTP版本RTU(支持GNSS)产品的软硬件全过程

HTTP版RTU&#xff08;支持GNSS&#xff09;项目概述 RTU&#xff08;Remote Terminal Unit&#xff09;&#xff0c;中文即远程终端控制系统&#xff0c;负责对现场信号、工业设备的监测和控制。RTU是构成企业综合自动化系统的核心装置&#xff0c;通常由信号输入/出模块、微…

RT-Thread内核简介

1、RT-Thread 内核介绍 RT-Thread 内核架构图,内核处于硬件层之上,内 核部分包括内核库、实时内核实现 内核库是为了保证内核能够独立运行的一套小型的类似 C 库的函数实现子集。这部分根据编译器的不 同自带 C 库的情况也会有些不同,当使用 GNU GCC 编译器时,会携带…

为什么ClickHouse查询速度快

导读&#xff1a;ClickHouse速度快的秘诀在于——利用存储引擎的特殊设计充分减少磁盘I/O对查询速度的影响。 ClickHouse为什么查询速度快&#xff1f;本文来揭秘。 1 从存储引擎视角看 ClickHouse速度快的秘诀在于——利用存储引擎的特殊设计充分减少磁盘I/O对查询速度的影…

全国各省环境规制强度数据(2004-2022年)

01、数据简介 以保护环境为目的&#xff0c;对各种环境污染行为进行规制&#xff0c;政府相关政策规制&#xff0c;是社会性规制的重要内容&#xff0c;包含大气、水、废弃物、噪声污染等外部行为&#xff0c;对这些行为进行规制就是要将整个社会为其承担的成本转化为其自身承…

通过一篇文章让你了解Linux的重要性

Linux 前言一、什么是Linux后台vs前台为何大多数公司选择使用Linux作为后台服务器 二、国内企业后台和用户使用Linux现状IT服务器Linux系统应用领域嵌入式Linux系统应用领域个人桌面应用领域 三、就个人能力提升来说&#xff0c;该如何看待Linux网络上的人都怎么说知乎 腾讯面经…

IDEA Warnings:SQL dialect is not configured.

springboot项目XxxMapper.xml文件打开后显示warnings&#xff1a;SQL dialect is not configured......&#xff08;翻译&#xff1a;未配置SQL语言。&#xff09; 大概意思是没有在IDEA中配置当前sql是MySQl、Oracle还是MariaDB等语言。 配置一下就好&#xff1a; 完了&#…

2024年150道高频Java面试题(二十七)

53. 什么是 Java 中的死锁&#xff1f;如何避免&#xff1f; Java中的死锁是指两个或两个以上的线程因为竞争资源而造成的一种僵持状态&#xff0c;每个线程都在等待其他线程释放锁&#xff0c;但是这些锁又被其他线程持有&#xff0c;导致没有任何线程能继续执行下去&#xf…

中国电子学会(CEIT)2022年03月真题C语言软件编程等级考试四级(含详细解析答案)

中国电子学会(CEIT)考评中心历届真题(含解析答案) C语言软件编程等级考试四级 2022年03月 编程题四道 总分:100分一、拦截导弹(25分) 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度…

npm: .npmrc pnpm

pnpm i 安装依赖时&#xff0c;pnpm 的镜像源优先级遵循以下顺序&#xff1a; 命令行参数&#xff1a;可以通过在 pnpm i 命令中使用 --registry 的方式指定镜像源&#xff0c;此时会优先使用命令行参数指定的镜像源。 pnpm i --registry< registry-url >.npmrc 配置&…

谈谈我的软考高级考证之路(系统架构设计师篇)

系统架构设计师备考资料请移步 2023年软考高级系统架构设计师视频教程&#xff0c;推荐下载&#xff01;获取。 备考总体策略 • 总体策略&#xff1a;刷视频记笔记刷真题 • 备考时间&#xff1a;建议报完名之后&#xff0c;开始备考&#xff0c;大致2-3个月&#xff08;基础…

【Java多线程】案例(4):定时器

目录 一、定时器是什么? 二、Java标准库中的定时器 三、自己实现定时器 四、标准库中更推荐使用的定时器 一、定时器是什么? 定时器是一种用于在指定时间间隔或特定时间点执行特定任务的工具或设备。在计算机科学中&#xff0c;定时器通常是软件或硬件组件&#xff0c;用…

智过网:注册安全工程师注册有效期与周期解析

在职业领域&#xff0c;各种专业资格认证不仅是对从业者专业能力的认可&#xff0c;也是保障行业安全、规范发展的重要手段。其中&#xff0c;注册安全工程师证书在安全生产领域具有举足轻重的地位。那么&#xff0c;注册安全工程师的注册有效期是多久呢&#xff1f;又是几年一…