@leetcode報數
這題是到目前為止,第乙個有點意思的需要腦子的題。說句實話,筆者思考許久,最多寫了4個迴圈,最終還是被自己菜到,卑微地去向大佬們學習借鑑了一下思路,發現本題需要乙個「逆向思維」,具體玄妙請看下文分解。廢話少說,上題幹:
1、 11 被讀作 「one 1」 (「乙個一」) , 即 11。2、 11
.3、 21
4、 1211
5、 111221
11 被讀作 「two 1s」 (「兩個一」), 即 21。
21 被讀作 「one 2」, 「one 1」 (「乙個二」 , 「乙個一」) , 即 1211。
給定乙個正整數 n(1 ≤ n ≤ 30),輸出報數序列的第 n 項。注意:整數順序將表示為乙個字串。
示例 1:
輸入: 1示例 2:輸出: 「1」
輸入: 4相信大多數的和筆者一樣的菜鳥,拿到題目腦子裡就開始構建迴圈了,於是思路就一步步飄出來:我從頭遍歷,檢查每個字元,如果他的下乙個字元與之相等,count就加一,否則就更新下乙個字元,重新算count。聽上去頭頭是道,下筆一寫,發現有問題迴圈的賦值有時候執行兩步,有時候執行一步,這就很尷尬了。輸出: 「1211」
下面我們可以看看他的思路:
首先進行特判,如果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...