【每日挠头算法题(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. 字符串解码

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

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

    (字符串 ) 459. 重复的子字符串——【Leetcode每日一题】

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

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

    【每日一题】构造限制重复的字符串

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

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

    【LeetCode每日一题】2182. 构造限制重复的字符串

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

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

    (动态规划) 剑指 Offer 48. 最长不含重复字符的子字符串 ——【Leetcode每日一题】

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

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

    算法刷题-字符串-重复的子字符串

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

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

    【力扣·每日一题】2182.构造限制重复的字符串(模拟 贪心 优先队列 C++ Go)

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

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

    (栈和队列) 1047. 删除字符串中的所有相邻重复项 ——【Leetcode每日一题】

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

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

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

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

    【每日算法】【205. 同构字符串】

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

    2024年02月11日
    浏览(12)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包