【每日挠头算法题(3)】字符串解码|数组中重复的数字

news2024/11/23 6:17:07

每日挠头算法题

  • 一、字符串解码
    • 思路:栈
      • 具体代码如下:
  • 二、数组中重复的数字
    • 思路1:计数法
      • 具体代码如下:
    • 思路2:原地交换法
      • 具体代码如下:
  • 总结


一、字符串解码

点我直达~

在这里插入图片描述

思路:栈

这道题怎么看都好像是用栈来实现,因为有左右括号。(可是第一时间我没想到)

  • 遍历字符串,此时会有几种情况:
  • 1.如果是数字字符,给一个num变量,将该字符转化成数字存储起来。
  • 2.如果是字母(题目说只可能是小写),给一个字符串str,将该字母存储到字符串里。
  • 3.如果是" [ ",此时需要将刚才的数字和字母分别入栈,将数字num入到nums栈,str入到strs栈,然后清空num和str
  • 4.如果是" ] “,先将nums栈的栈顶元素取出来给给top变量,然后循环top次将str追加到strs栈的栈顶元素后面,比如这时候strs栈栈顶元素是"aaa”,str是"ab",top = 2,那么就将str追加,结果为:aaaabab。最后再将strs栈的栈顶元素赋值回给str。
  • 注意:遇到" ] “后,下一个字符不可能是” [ ",不符合题目要求,只可能是数字字符或字母字符,仍然会按照正常的流程继续走下去。
  • 最后返回str即可。

具体代码如下:

class Solution {
public:
    string decodeString(string s) 
    {
        int num = 0; //存储数字
        string str = ""; //存储字符串
        stack<int> nums; //遇到'[':数字入数字栈
        stack<string> strs;//字符串入字符串栈

        for(int i = 0;i<s.size();++i)
        {
            if(s[i] >='0' && s[i] <= '9')
            {
                //如果出现连续的数字,个位就要*10再加起来
                num = num * 10 + (s[i] - '0') ;
            }
            else if(s[i] >= 'a' && s[i] <='z')
            {
                str = str + s[i];
            }
            else if(s[i] == '[')
            {
                //入数字栈
                nums.push(num);
                num = 0;
                //入字符串栈
                strs.push(str);
                str = "";
            }
            //遇到']'了
            else
            {
                int top = nums.top();
                nums.pop();
                for(int j = 0;j<top;++j)
                {
                    //注意这里是将str追加到栈顶元素之后
                    strs.top() += str;
                }
                //将栈顶元素给回str
                //']'之后接下来的字符不可能是'[',这不符合题目要求
                //所以接下来的字符不管是数字还是字母,都可以正常进行
                str = strs.top();
                strs.pop();
            }
        }
        return str;
    }
};

时间复杂度:O(N),空间复杂度O(1)

二、数组中重复的数字

点我直达~

在这里插入图片描述

思路1:计数法

具体过程如下:

  • 1.开一个n大小的顺序表,初始化为0,作为0~n-1区间的每个数字出现的次数。
  • 2.遍历一遍数组,将出现的数字在计数顺序表的位置++,比如:出现的数字是5,那么就在顺序表的下标5的位置+1
  • 3.如果计数顺序表中的任意元素出现次数大于1,则说明对应的元素重复出现,返回即可。

具体代码如下:

class Solution {
public:
 
    int findRepeatNumber(vector<int>& nums) 
    {
        int n = nums.size();
        vector<int> count(n);
        for(int i =0;i<nums.size();++i)
        {
            count[nums[i]]++;
            if(count[nums[i]] > 1)
                return nums[i];
        }
        return -1;
    }
};

时间复杂度O(n),空间复杂度O(n)

思路2:原地交换法

这个方法也可以理解为:岗位对接人才问题。

具体如下:

  • 1.这个原地交换法就相当于分配工作,每个索引代表一个工作岗位,每个岗位必须专业对口,既0索引必须0元素才能上岗。而我们的目的就是找出溢出的人才,既0索引岗位有多个0元素竞争。
  • 2.我们先从0索引岗位开始遍历,首先我们看0索引是不是已经专业对口了,如果已经专业对口既nums[0]=0,那我们就跳过0岗位看1岗位。
  • 3.如果0索引没有专业对口,那么我们看现在0索引上的人才调整到他对应的岗位上,比如num[0]=2,那我们就把2这个元素挪到他对应的岗位上既num[2],这个时候有两种情况:
    • 1、num[2]岗位上已经有专业对口的人才了,既num[2]=2,这就说明刚刚那个在num[0]上的2是溢出的人才,我们直接将其返回即可。
    • 2、num[2]上的不是专业对口的人才,那我们将num[0]上的元素和num[2]上的元素交换,这样num[2]就找到专业对口的人才了。
  • 4.之后重复这个过程直到帮num[0]找到专业对口的人才,然后以此类推帮num[1]找人才、帮num[2]找人才,直到找到溢出的人才。

图解过程如下:

在这里插入图片描述

具体代码如下:

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) 
    {
        int i = 0;
        while(i < nums.size())
        {
            //岗位和人才对口了,继续往下找,直到找到溢出的人才
            if(i == nums[i])
            {
                ++i;
                continue;
            }

            //情况1.该人才是溢出人才
            if(nums[i] == nums[nums[i]])
                return nums[i];

            //情况2.不是溢出人才,那就把该人才调整到对应岗位
            else
                swap(nums[i],nums[nums[i]]);

        }
        
        return -1;
    }
};

时间复杂度O(n),空间复杂度O(1)

总结

通过今天的两道题:

  • 1.我发现只要有括号的匹配,或者有涉及到括号的,都可以考虑使用栈来解决。

  • 2.对于找重复的数字/字符串/字符等,均可使用计数法,空间复杂度O(N)来统计出现次数。
    或者使用“岗位对接人才”的原地交换法解决此类问题。

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

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

相关文章

python 爬虫某东网商品信息 | 没想到销量最高的是

哈喽大家好&#xff0c;我是咸鱼 好久没更新 python 爬虫相关的文章了&#xff0c;今天我们使用 selenium 模块来简单写个爬虫程序——爬取某东网商品信息 网址链接&#xff1a;https://www.jd.com/ 完整源码在文章最后 元素定位 我们需要找到网页上元素的位置信息&#x…

Spring内容

(195条消息) 超高频面试题系列之----Spring全家桶&#xff08;面试亲测&#xff09;_spring全家桶面试题_zyyn_未来可期的博客-CSDN博客 1、推断构造方法&#xff1a; &#xff08;1&#xff09;如果只有一个构造方法&#xff0c;没问题就用这个 &#xff08;2&#xff09;如…

Java学习路线(26)——XML与设计模式

一、XML &#xff08;一&#xff09;XML的概念&#xff1a; XML是可扩展标记语言&#xff08;Extensible Markup Language&#xff09;&#xff0c;一种数据表示形式&#xff0c;可以描述非常复杂的数据结构&#xff0c;常用于传输和存储数据。 &#xff08;二&#xff09;XM…

day50|动态规划11-买卖股票的最佳实际3-4(限制买卖次数的情况)

123.买卖股票的最佳时机III 确定递归函数&#xff0c;当前的每一个状态都由前一天决定。 以dp[i][1]和dp[i][2]为例讲解递归函数的含义&#xff1a; dp[i][1]max(dp[i-1][1],dp[i-1][0]-prices[i]) 含义&#xff1a; 第i天的股票第一天持有状态有两种&#xff0c;一种是前一…

电脑msvcr100.dll丢失的解决方法(一键修复方法)

msvcr100.dll是Microsoft Visual C运行时库的组成部分之一&#xff0c;它是一个重要的动态链接库&#xff08;DLL&#xff09;文件&#xff0c;可在Windows操作系统上运行。它包含了许多C/C语言程序库函数的实现&#xff0c;常常被用于支持和调用不同软件程序的运算&#xff0c…

POSTGRES、MYSQL插入数据的UPDATE_INSERT实践

POSTGRES: 1、创建表 create table tbl_user( id serial PRIMARY KEY, name varchar(256), addr varchar(256), age int, score int, fav varchar(256) ); 2、创建唯一约束 alter table tbl_user add constraint name_add_age_unique unique(name,addr,age); 3、首先插入两条数…

Ansible自定义静态资产以及常用模块

静态资产 文件文件&#xff0c;一个格式类似于INI的文件 默认情况下&#xff0c;Ansible的资产文件位于/etc/ansible/host&#xff0c;如果使用pip安装的则可能没有这文件&#xff0c;可以自己创建。 1、自定义资产 #自定义编写inventory.ini文件 1.1.1.1 2.2.2.2 3.3.3.[1:15]…

【C++】—— 模板介绍

前言&#xff1a; 在之前的学习中&#xff0c;我们已经对几个常见的STL库容器进行了详细的讲解&#xff0c;并且进行了模拟实现帮助大家立即。接下来&#xff0c;我们要介绍的就是关于 “模板” 的基本知识。 目录 前言 &#xff08;一&#xff09;非类型模板参数 1、基本介…

Splashtop 推出首款专门面向创作者和创意工作室的高性能远程软件

2023年5月3日 加利福尼亚州库比蒂诺 Splashtop 在简化随处办公的远程解决方案领域处于领先地位&#xff0c;公司今天宣布推出 Splashtop Business Access Performance&#xff0c;这是一款全新的远程访问解决方案&#xff0c;针对独立艺术家、游戏玩家、建筑与设计以及创意公司…

Opencv项目实战:基于dlib的疲劳检测

文章目录 一、项目简介二、算法原理三、环境配置3.1、dlib人脸检测器&#xff1a;dlib.get_frontal_face_detector()3.2、dlib关键点定位工具&#xff1a;shape_predictor_68_face_landmarks.dat 四、项目实战&#xff08;加载视频&#xff09;五、项目实战&#xff08;摄像头获…

软件测试猿和bug的爱恨情仇

对程序猿来说改bug可以位列开发过程中最讨厌的事之首了&#xff0c;这么讲应该没有人会反对吧&#xff1f;因为就连Java之父詹姆斯高斯林也很讨厌Bug。 另一方面对于测试猿来说工作职责就是尽可能多地找出bug&#xff0c;并确保其得以解决。所以被程序猿视为眼中钉肉中刺的bug可…

Doris半结构化数据分析(倒排索引使用)快速入门

1. 背景 Apache Doris2.0 基于Apache Doris向量化MPP引擎&#xff0c;增加了倒排索引和半结构化JSON数据支持&#xff0c;更好地满足日志存储、检索、分析需求。与基于ES的日志存储方案相比&#xff0c;有如下优势&#xff1a; 性价比提升&#xff1a;存储成本降低50%以上&am…

‍☠️stm32Cubemx欠采样原理讲解与实现 采集高频信号

&#x1f3f4;‍☠️STM32Cubemx ADCTIMDMA欠采样采集高频信号 本文主要讲解ADC借助欠采样采集高频信号&#xff0c;比如使用100k左右的采样率去采集1M的信号。 所需工具&#xff1a; 开发板:STM32F103RCT6STM32CubeMXIDE: Keil-MDK 相关文章&#xff1a; STM32HAL ADCTIM…

2核4G轻量服务器阿里云和腾讯云区别对比

阿里云轻量应用服务器2核4G4M带宽297.98元12个月&#xff0c;腾讯云轻量2核4G5M服务器168元一年&#xff0c;628元3年&#xff0c;2核4G轻量应用服务器阿里云和腾讯云怎么选择&#xff1f;哪个性能比较好&#xff1f;阿腾云分享轻量应用服务器2核4G配置阿里云和腾讯云CPU、带宽…

打破互联网思维,我们该如何思考?

在会议上&#xff0c;你是否流程规范讲到一半突然卡逻辑、测分会议疯狂输出周围却一脸问号&#xff1f;提交缺陷时&#xff0c;你又是否被告知看不懂&#xff0c;要求补充信息&#xff1f;受挫时捶胸顿足“表达可太太太重要了&#xff0c;难道我天生脑子转的就比别人慢&#xf…

基于深度学习的高精度红外行人车辆检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度红外行人车辆检测识别系统可用于日常生活中或野外来检测与定位红外行人车辆目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的红外行人车辆目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系…

围绕中国旅行商问题完成综合性实验报告 旅行商问题

题目&#xff1a;围绕中国旅行商问题完成综合性实验报告 旅行商问题&#xff08;TSP问题&#xff09;。 假设有一个旅行商人要拜访全国31个省会城市&#xff0c;它需要选择所要走的路径&#xff0c;路径的限制是每个城市只能拜访一次&#xff0c;而且最后要回到原来出发的城市。…

【裸机驱动LED】使用C代码驱动LED(三)—— C代码编写篇

前面只使用了汇编代码来驱动LED&#xff0c;但是对于后续一些比较复杂的逻辑&#xff0c;使用汇编代码编写驱动的难度太大&#xff0c;因此&#xff0c;这次我们要使用C语言代码来驱动LED。 除了C代码外&#xff0c;依然需要编写汇编代码&#xff0c;在没有OS的情况下&#xf…

基于黄金莱维引导机制的阿基米德优化算法(MSAOA)-附代码

基于黄金莱维引导机制的阿基米德优化算法(MSAOA) 文章目录 基于黄金莱维引导机制的阿基米德优化算法(MSAOA)1.阿基米德优化算法2. 改进阿基米德优化算法2.1 变区间初始化策略2.2 黄金莱维引导机制2.3 自适应波长算子 3.实验结果4.参考文献5.Matlab代码6.Python代码 摘要&#x…

什么是接口测试?怎么做接口测试?Apifox 教你做!

目录 前言&#xff1a; 一、什么是接口测试&#xff1f; 二、接口测试的步骤 三、接口测试工具的选择 四、总结 前言&#xff1a; 随着互联网和移动互联网的发展&#xff0c;企业面对着越来越庞大和复杂的系统和数据接口。在这种情况下&#xff0c;手动测试不再能够满足测…