Leetcode報數演算法與分析

2021-09-25 09:23:15 字數 1624 閱讀 9832

@leetcode報數

這題是到目前為止,第乙個有點意思的需要腦子的題。說句實話,筆者思考許久,最多寫了4個迴圈,最終還是被自己菜到,卑微地去向大佬們學習借鑑了一下思路,發現本題需要乙個「逆向思維」,具體玄妙請看下文分解。廢話少說,上題幹:

1、 1

2、 11

.3、 21

4、 1211

5、 111221

1 被讀作 「one 1」 (「乙個一」) , 即 11。

11 被讀作 「two 1s」 (「兩個一」), 即 21。

21 被讀作 「one 2」, 「one 1」 (「乙個二」 , 「乙個一」) , 即 1211。

給定乙個正整數 n(1 ≤ n ≤ 30),輸出報數序列的第 n 項。注意:整數順序將表示為乙個字串。

示例 1:

輸入: 1

輸出: 「1」

示例 2:

輸入: 4

輸出: 「1211」

相信大多數的和筆者一樣的菜鳥,拿到題目腦子裡就開始構建迴圈了,於是思路就一步步飄出來:我從頭遍歷,檢查每個字元,如果他的下乙個字元與之相等,count就加一,否則就更新下乙個字元,重新算count。聽上去頭頭是道,下筆一寫,發現有問題迴圈的賦值有時候執行兩步,有時候執行一步,這就很尷尬了。

下面我們可以看看他的思路:

首先進行特判,如果n就為1,那麼輸出也就是1,這是因為之後的判斷中,是以前面乙個數字為判斷條件,這就是我所說的「逆向思維」,有時一些違反常規的判斷方式往往能取得意想不到的效果。特判完成之後字串可以定義為11,開始從2到n的迴圈,由於每次外層迴圈都會更新乙個字串,所以我們這裡將即將算出的字串先定為空,並且將判斷的標誌放在了str[0]的位置,計數器設為1(無論如何只要出現數字,至少出現1次),並開始內層從1開始一直到未更新的str的總長度的判斷。

在內層判斷中,如果當前值與前乙個值相等,計數器加一,否則說明前乙個值的數字計算已經到了最後,於是我們在新的字串中push_back計數器的值,再push_back一下前乙個值,完成這幾個操作後重置計數器,並且將當前值變為接下來要比較的那個「前乙個值」,繼續迴圈判斷,直到達到最大長度值。這之後得到的字串已經替代了11成為了新的str,這時外層迴圈加一,繼續定義新的空字串存放下一層,如此反覆直到達到目標n值。

**如下:

本題要注意的細節有以下幾部分:

首先,要注意在輸出計數器的值時要加上』0』,由於是往字串中加入值,所以要注意轉換成char型別。另外,在輸出的時候一定是在for迴圈的外面,所以不能直接使用newstr輸出,而要使用已定義的字串通過賦值來正確地輸出字串。

LeetCode演算法入門 報數 解法與分析

1.1 2.11 3.21 4.1211 5.1112211被讀作 one 1 乙個一 即11。11被讀作 two 1s 兩個一 即21。21被讀作 one 2 one 1 乙個二 乙個一 即1211。給定乙個正整數 n 1 n 30 輸出報數序列的第 n 項。注意 整數順序將表示為乙個字串。示例 ...

每日演算法 報數

1.1 2.11 3.21 4.1211 5.1112211被讀作 one 1 乙個一 即11。11被讀作 two 1s 兩個一 即21。21被讀作 one 2 one 1 乙個二 乙個一 即1211。給定乙個正整數 n 1 n 30 輸出報數序列的第 n 項。注意 整數順序將表示為乙個字串。示例 ...

Leetcode兩數之和演算法與分析

leetcode兩數之和演算法 題幹如下 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的 兩個 整數。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例如下 給定nums 2,7,11,15 target 9 因為 nums 0...