国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【每日撓頭算法題(3)】字符串解碼|數(shù)組中重復(fù)的數(shù)字

這篇具有很好參考價(jià)值的文章主要介紹了【每日撓頭算法題(3)】字符串解碼|數(shù)組中重復(fù)的數(shù)字。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


一、字符串解碼

點(diǎn)我直達(dá)~

【每日撓頭算法題(3)】字符串解碼|數(shù)組中重復(fù)的數(shù)字

思路:棧

這道題怎么看都好像是用棧來(lái)實(shí)現(xiàn),因?yàn)橛凶笥依ㄌ?hào)。(可是第一時(shí)間我沒(méi)想到)

  • 遍歷字符串,此時(shí)會(huì)有幾種情況:
  • 1.如果是數(shù)字字符,給一個(gè)num變量,將該字符轉(zhuǎn)化成數(shù)字存儲(chǔ)起來(lái)。
  • 2.如果是字母(題目說(shuō)只可能是小寫(xiě)),給一個(gè)字符串str,將該字母存儲(chǔ)到字符串里。
  • 3.如果是" [ ",此時(shí)需要將剛才的數(shù)字和字母分別入棧,將數(shù)字num入到nums棧,str入到strs棧,然后清空num和str
  • 4.如果是" ] “,先將nums棧的棧頂元素取出來(lái)給給top變量,然后循環(huán)top次將str追加到strs棧的棧頂元素后面,比如這時(shí)候strs棧棧頂元素是"aaa”,str是"ab",top = 2,那么就將str追加,結(jié)果為:aaaabab。最后再將strs棧的棧頂元素賦值回給str。
  • 注意:遇到" ] “后,下一個(gè)字符不可能是” [ ",不符合題目要求,只可能是數(shù)字字符或字母字符,仍然會(huì)按照正常的流程繼續(xù)走下去。
  • 最后返回str即可。

具體代碼如下:

class Solution {
public:
    string decodeString(string s) 
    {
        int num = 0; //存儲(chǔ)數(shù)字
        string str = ""; //存儲(chǔ)字符串
        stack<int> nums; //遇到'[':數(shù)字入數(shù)字棧
        stack<string> strs;//字符串入字符串棧

        for(int i = 0;i<s.size();++i)
        {
            if(s[i] >='0' && s[i] <= '9')
            {
                //如果出現(xiàn)連續(xù)的數(shù)字,個(gè)位就要*10再加起來(lái)
                num = num * 10 + (s[i] - '0') ;
            }
            else if(s[i] >= 'a' && s[i] <='z')
            {
                str = str + s[i];
            }
            else if(s[i] == '[')
            {
                //入數(shù)字棧
                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
                //']'之后接下來(lái)的字符不可能是'[',這不符合題目要求
                //所以接下來(lái)的字符不管是數(shù)字還是字母,都可以正常進(jìn)行
                str = strs.top();
                strs.pop();
            }
        }
        return str;
    }
};

時(shí)間復(fù)雜度:O(N),空間復(fù)雜度O(1)

二、數(shù)組中重復(fù)的數(shù)字

點(diǎn)我直達(dá)~

【每日撓頭算法題(3)】字符串解碼|數(shù)組中重復(fù)的數(shù)字

思路1:計(jì)數(shù)法

具體過(guò)程如下:

  • 1.開(kāi)一個(gè)n大小的順序表,初始化為0,作為0~n-1區(qū)間的每個(gè)數(shù)字出現(xiàn)的次數(shù)。
  • 2.遍歷一遍數(shù)組,將出現(xiàn)的數(shù)字在計(jì)數(shù)順序表的位置++,比如:出現(xiàn)的數(shù)字是5,那么就在順序表的下標(biāo)5的位置+1
  • 3.如果計(jì)數(shù)順序表中的任意元素出現(xiàn)次數(shù)大于1,則說(shuō)明對(duì)應(yīng)的元素重復(fù)出現(xiàn),返回即可。

具體代碼如下:

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;
    }
};

時(shí)間復(fù)雜度O(n),空間復(fù)雜度O(n)

思路2:原地交換法

這個(gè)方法也可以理解為:崗位對(duì)接人才問(wèn)題。

具體如下:

  • 1.這個(gè)原地交換法就相當(dāng)于分配工作,每個(gè)索引代表一個(gè)工作崗位,每個(gè)崗位必須專(zhuān)業(yè)對(duì)口,既0索引必須0元素才能上崗。而我們的目的就是找出溢出的人才,既0索引崗位有多個(gè)0元素競(jìng)爭(zhēng)。
  • 2.我們先從0索引崗位開(kāi)始遍歷,首先我們看0索引是不是已經(jīng)專(zhuān)業(yè)對(duì)口了,如果已經(jīng)專(zhuān)業(yè)對(duì)口既nums[0]=0,那我們就跳過(guò)0崗位看1崗位。
  • 3.如果0索引沒(méi)有專(zhuān)業(yè)對(duì)口,那么我們看現(xiàn)在0索引上的人才調(diào)整到他對(duì)應(yīng)的崗位上,比如num[0]=2,那我們就把2這個(gè)元素挪到他對(duì)應(yīng)的崗位上既num[2],這個(gè)時(shí)候有兩種情況:
    • 1、num[2]崗位上已經(jīng)有專(zhuān)業(yè)對(duì)口的人才了,既num[2]=2,這就說(shuō)明剛剛那個(gè)在num[0]上的2是溢出的人才,我們直接將其返回即可。
    • 2、num[2]上的不是專(zhuān)業(yè)對(duì)口的人才,那我們將num[0]上的元素和num[2]上的元素交換,這樣num[2]就找到專(zhuān)業(yè)對(duì)口的人才了。
  • 4.之后重復(fù)這個(gè)過(guò)程直到幫num[0]找到專(zhuān)業(yè)對(duì)口的人才,然后以此類(lèi)推幫num[1]找人才、幫num[2]找人才,直到找到溢出的人才。

圖解過(guò)程如下:

【每日撓頭算法題(3)】字符串解碼|數(shù)組中重復(fù)的數(shù)字

具體代碼如下:

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) 
    {
        int i = 0;
        while(i < nums.size())
        {
            //崗位和人才對(duì)口了,繼續(xù)往下找,直到找到溢出的人才
            if(i == nums[i])
            {
                ++i;
                continue;
            }

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

            //情況2.不是溢出人才,那就把該人才調(diào)整到對(duì)應(yīng)崗位
            else
                swap(nums[i],nums[nums[i]]);

        }
        
        return -1;
    }
};

時(shí)間復(fù)雜度O(n),空間復(fù)雜度O(1)

總結(jié)

通過(guò)今天的兩道題:

  • 1.我發(fā)現(xiàn)只要有括號(hào)的匹配,或者有涉及到括號(hào)的,都可以考慮使用棧來(lái)解決。

  • 2.對(duì)于找重復(fù)的數(shù)字/字符串/字符等,均可使用計(jì)數(shù)法,空間復(fù)雜度O(N)來(lái)統(tǒng)計(jì)出現(xiàn)次數(shù)。
    或者使用“崗位對(duì)接人才”的原地交換法解決此類(lèi)問(wèn)題。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-476606.html

到了這里,關(guān)于【每日撓頭算法題(3)】字符串解碼|數(shù)組中重復(fù)的數(shù)字的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 力扣熱門(mén)算法題 349. 兩個(gè)數(shù)組的交集,387. 字符串中的第一個(gè)唯一字符,394. 字符串解碼

    力扣熱門(mén)算法題 349. 兩個(gè)數(shù)組的交集,387. 字符串中的第一個(gè)唯一字符,394. 字符串解碼

    349. 兩個(gè)數(shù)組的交集,387. 字符串中的第一個(gè)唯一字符,394. 字符串解碼,每題做詳細(xì)思路梳理,配套PythonJava雙語(yǔ)代碼, 2024.04.02?可通過(guò)leetcode所有測(cè)試用例。 目錄 349. 兩個(gè)數(shù)組的交集 解題思路 完整代碼 Python Java 387. 字符串中的第一個(gè)唯一字符 解題思路 完整代碼 Python Java

    2024年04月08日
    瀏覽(30)
  • (字符串 ) 459. 重復(fù)的子字符串——【Leetcode每日一題】

    (字符串 ) 459. 重復(fù)的子字符串——【Leetcode每日一題】

    難度:簡(jiǎn)單 給定一個(gè)非空的字符串 s ,檢查是否可以通過(guò)由它的一個(gè)子串重復(fù)多次構(gòu)成。 示例 1: 輸入: s = “abab” 輸出: true 解釋: 可由子串 “ab” 重復(fù)兩次構(gòu)成。 示例 2: 輸入: s = “aba” 輸出: false 示例 3: 輸入: s = “abcabcabcabc” 輸出: true 解釋: 可由子串 “abc” 重復(fù)四次構(gòu)

    2024年02月07日
    瀏覽(22)
  • 【每日一題】構(gòu)造限制重復(fù)的字符串

    【每日一題】構(gòu)造限制重復(fù)的字符串

    【貪心】【字符串】【2024-01-13】 2182. 構(gòu)造限制重復(fù)的字符串 思路 解題思想比較簡(jiǎn)單,利用貪心思想,每次選擇當(dāng)前剩余字符串中字典序最大的字符加到答案字符串末尾,如果答案字符串末尾的字符已經(jīng)連續(xù)出現(xiàn)了 repeatLimit 次,則將字典序次大的字符加到答案字符串,隨后

    2024年01月22日
    瀏覽(29)
  • 【LeetCode每日一題】2182. 構(gòu)造限制重復(fù)的字符串

    【LeetCode每日一題】2182. 構(gòu)造限制重復(fù)的字符串

    2024-1-13 2182. 構(gòu)造限制重復(fù)的字符串 思路: 按照字符出現(xiàn)次數(shù)從高到低的順序進(jìn)行重復(fù),通過(guò)維護(hù)一個(gè)指針 j 來(lái)尋找下一個(gè)非零出現(xiàn)次數(shù)的字母。同時(shí),利用 StringBuilder 對(duì)象可以高效地構(gòu)建字符串,避免頻繁的字符串拼接操作 首先,創(chuàng)建一個(gè)長(zhǎng)度為26的數(shù)組 cnt ,用于統(tǒng)計(jì)字

    2024年01月18日
    瀏覽(25)
  • (動(dòng)態(tài)規(guī)劃) 劍指 Offer 48. 最長(zhǎng)不含重復(fù)字符的子字符串 ——【Leetcode每日一題】

    (動(dòng)態(tài)規(guī)劃) 劍指 Offer 48. 最長(zhǎng)不含重復(fù)字符的子字符串 ——【Leetcode每日一題】

    難度:中等 請(qǐng)從字符串中找出一個(gè)最長(zhǎng)的不包含重復(fù)字符的子字符串,計(jì)算該最長(zhǎng)子字符串的長(zhǎng)度。 示例 1: 輸入: “abcabcbb” 輸出: 3 解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 “abc”,所以其長(zhǎng)度為 3。 示例 2: 輸入: “bbbbb” 輸出: 1 解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 “b”,所

    2024年02月11日
    瀏覽(26)
  • 算法刷題-字符串-重復(fù)的子字符串

    算法刷題-字符串-重復(fù)的子字符串

    KMP算法還能干這個(gè) 力扣題目鏈接 給定一個(gè)非空的字符串,判斷它是否可以由它的一個(gè)子串重復(fù)多次構(gòu)成。給定的字符串只含有小寫(xiě)英文字母,并且長(zhǎng)度不超過(guò)10000。 示例 1: 輸入: “abab” 輸出: True 解釋: 可由子字符串 “ab” 重復(fù)兩次構(gòu)成。 示例 2: 輸入: “aba” 輸出: False 示

    2024年02月09日
    瀏覽(25)
  • 【力扣·每日一題】2182.構(gòu)造限制重復(fù)的字符串(模擬 貪心 優(yōu)先隊(duì)列 C++ Go)

    【力扣·每日一題】2182.構(gòu)造限制重復(fù)的字符串(模擬 貪心 優(yōu)先隊(duì)列 C++ Go)

    題目鏈接 給你一個(gè)字符串 s 和一個(gè)整數(shù) repeatLimit ,用 s 中的字符構(gòu)造一個(gè)新字符串 repeatLimitedString ,使任何字母 連續(xù) 出現(xiàn)的次數(shù)都不超過(guò) repeatLimit 次。你不必使用 s 中的全部字符。 返回 字典序最大的 repeatLimitedString 。 如果在字符串 a 和 b 不同的第一個(gè)位置,字符串 a 中

    2024年01月17日
    瀏覽(20)
  • (棧和隊(duì)列) 1047. 刪除字符串中的所有相鄰重復(fù)項(xiàng) ——【Leetcode每日一題】

    (棧和隊(duì)列) 1047. 刪除字符串中的所有相鄰重復(fù)項(xiàng) ——【Leetcode每日一題】

    難度:簡(jiǎn)單 給出由小寫(xiě)字母組成的字符串 S , 重復(fù)項(xiàng)刪除操作 會(huì)選擇兩個(gè)相鄰且相同的字母,并刪除它們。 在 S 上反復(fù)執(zhí)行重復(fù)項(xiàng)刪除操作,直到無(wú)法繼續(xù)刪除。 在完成所有重復(fù)項(xiàng)刪除操作后返回最終的字符串。答案保證唯一。 示例: 輸入 :“abbaca” 輸出 :“ca” 解釋

    2024年02月08日
    瀏覽(24)
  • C語(yǔ)言實(shí)現(xiàn)刪除字符串中重復(fù)字符的算法

    C語(yǔ)言實(shí)現(xiàn)刪除字符串中重復(fù)字符的算法 問(wèn)題描述: 給定一個(gè)字符串,我們需要編寫(xiě)一個(gè)C語(yǔ)言函數(shù),以刪除字符串中的重復(fù)字符。例如,對(duì)于輸入字符串\\\"hello world\\\",函數(shù)應(yīng)該返回\\\"hel wrd\\\"。 算法思路: 為了解決這個(gè)問(wèn)題,我們可以使用一個(gè)哈希表來(lái)跟蹤每個(gè)字符的出現(xiàn)次數(shù)。

    2024年02月04日
    瀏覽(27)
  • 【每日算法】【205. 同構(gòu)字符串】

    【每日算法】【205. 同構(gòu)字符串】

    ??博客主頁(yè):CSDN博客主頁(yè) ??本文由 我是小狼君 原創(chuàng),首發(fā)于 CSDN?? ??學(xué)習(xí)專(zhuān)欄推薦:面試匯總 ??游戲框架專(zhuān)欄推薦:游戲?qū)嵱每蚣軐?zhuān)欄 ??點(diǎn)贊 ?? 收藏 ?留言 ??,如有錯(cuò)誤請(qǐng)指正 ?? 未來(lái)很長(zhǎng),值得我們?nèi)Ρ几案篮玫纳? 老規(guī)矩,先介紹一下 Unity 的科

    2024年02月11日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包