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

这篇具有很好参考价值的文章主要介绍了【每日挠头算法题(3)】字符串解码|数组中重复的数字。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、字符串解码

点我直达~

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

思路:栈

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

  • 遍历字符串,此时会有几种情况:
  • 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)

二、数组中重复的数字

点我直达~

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

思路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]找人才,直到找到溢出的人才。

图解过程如下:

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

具体代码如下:

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)来统计出现次数。
    或者使用“岗位对接人才”的原地交换法解决此类问题。文章来源地址https://www.toymoban.com/news/detail-476606.html

到了这里,关于【每日挠头算法题(3)】字符串解码|数组中重复的数字的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 力扣热门算法题 349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码

    349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码,每题做详细思路梳理,配套PythonJava双语代码, 2024.04.02 可通过leetcode所有测试用例。 目录 349. 两个数组的交集 解题思路 完整代码 Python Java 387. 字符串中的第一个唯一字符 解题思路 完整代码 Python Java

    2024年04月08日
    浏览(31)
  • (字符串 ) 459. 重复的子字符串——【Leetcode每日一题】

    难度:简单 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s = “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。 示例 2: 输入: s = “aba” 输出: false 示例 3: 输入: s = “abcabcabcabc” 输出: true 解释: 可由子串 “abc” 重复四次构

    2024年02月07日
    浏览(34)
  • 【每日一题】构造限制重复的字符串

    【贪心】【字符串】【2024-01-13】 2182. 构造限制重复的字符串 思路 解题思想比较简单,利用贪心思想,每次选择当前剩余字符串中字典序最大的字符加到答案字符串末尾,如果答案字符串末尾的字符已经连续出现了 repeatLimit 次,则将字典序次大的字符加到答案字符串,随后

    2024年01月22日
    浏览(29)
  • 【LeetCode每日一题】2182. 构造限制重复的字符串

    2024-1-13 2182. 构造限制重复的字符串 思路: 按照字符出现次数从高到低的顺序进行重复,通过维护一个指针 j 来寻找下一个非零出现次数的字母。同时,利用 StringBuilder 对象可以高效地构建字符串,避免频繁的字符串拼接操作 首先,创建一个长度为26的数组 cnt ,用于统计字

    2024年01月18日
    浏览(29)
  • (动态规划) 剑指 Offer 48. 最长不含重复字符的子字符串 ——【Leetcode每日一题】

    难度:中等 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所

    2024年02月11日
    浏览(44)
  • 算法刷题-字符串-重复的子字符串

    KMP算法还能干这个 力扣题目链接 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。 示例 1: 输入: “abab” 输出: True 解释: 可由子字符串 “ab” 重复两次构成。 示例 2: 输入: “aba” 输出: False 示

    2024年02月09日
    浏览(33)
  • (栈和队列) 1047. 删除字符串中的所有相邻重复项 ——【Leetcode每日一题】

    难度:简单 给出由小写字母组成的字符串 S , 重复项删除操作 会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 示例: 输入 :“abbaca” 输出 :“ca” 解释

    2024年02月08日
    浏览(31)
  • 【力扣·每日一题】2182.构造限制重复的字符串(模拟 贪心 优先队列 C++ Go)

    题目链接 给你一个字符串 s 和一个整数 repeatLimit ,用 s 中的字符构造一个新字符串 repeatLimitedString ,使任何字母 连续 出现的次数都不超过 repeatLimit 次。你不必使用 s 中的全部字符。 返回 字典序最大的 repeatLimitedString 。 如果在字符串 a 和 b 不同的第一个位置,字符串 a 中

    2024年01月17日
    浏览(39)
  • C语言实现删除字符串中重复字符的算法

    C语言实现删除字符串中重复字符的算法 问题描述: 给定一个字符串,我们需要编写一个C语言函数,以删除字符串中的重复字符。例如,对于输入字符串\\\"hello world\\\",函数应该返回\\\"hel wrd\\\"。 算法思路: 为了解决这个问题,我们可以使用一个哈希表来跟踪每个字符的出现次数。

    2024年02月04日
    浏览(30)
  • 【每日算法】【205. 同构字符串】

    ☀️博客主页:CSDN博客主页 💨本文由 我是小狼君 原创,首发于 CSDN💢 🔥学习专栏推荐:面试汇总 ❗️游戏框架专栏推荐:游戏实用框架专栏 ⛅️点赞 👍 收藏 ⭐留言 📝,如有错误请指正 📆 未来很长,值得我们全力奔赴更美好的生活✨ 老规矩,先介绍一下 Unity 的科

    2024年02月11日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包