這個
星期六要考四級,真的是花36塊錢體驗下卷子。上次去華南理工比數學競賽,沒想到成功混了乙個一等獎
首先來看看題目:
給定乙個數字字串 s,比如 s = "123456579",我們可以將它分成斐波那契式的序列 [123, 456, 579]。形式上,斐波那契式序列是乙個非負整數列表 f,且滿足:0 <= f[i] <= 2^31 - 1,(也就是說,每個整數都符合 32 位有符號整數型別);f.length >= 3;對於所有的0 <= i < f.length - 2,都有 f[i] + f[i+1] = f[i+2] 成立。另外,請注意,將字串拆分成小塊時,每個塊的數字一定不要以零開頭,除非這個塊是數字 0 本身。返回從 s 拆分出來的任意一組斐波那契式的序列塊,如果不能拆分則返回 。
示例 1:輸入:"123456579"輸出:[123,456,579]
簡單明瞭,給定乙個字串,你需要將其拆分成斐波那契數列,如果無法拆分則返回 [ ] 。
我們知道斐波那契數列滿足:除了第乙個數和第二個數以外
,列表中的每個數字都等於前兩個數字的和。於是,我們去列舉第乙個數和第二個數,然後把他們倆加起來,判斷是否等於列舉出的第三個,如果等於,就把第三個數加入到答案中來,並去判斷第四個數是否符合斐波那契數列,否則退回第二個數,繼續列舉。
若第二個數也列舉完了,但還無法滿足斐波那契數列,則退回到第乙個數,即繼續列舉第乙個數。這說明回溯改變的是前兩個數字,只有當前兩個數字確定了,後面所有的數都將確定。需要說明的是:兩個數字相加,和的長度不會超過兩個數中的最大長度+1。
因為題目給定了整數的範圍2^31-1即 2147483647,所以列舉的數字長度不會超過10位。
斐波那契數列至少要有3個數字,且前兩個數字相加等於第三個數,所以乙個字串的長度不會超過(n-1)//2
**如下:
def splitintofibonacci(s): n,up = len(s),2147483647 for i in range(1,11):#最大數值長度不超過10個 for j in range(1,min(11,n-i)):#控制步長 ans = [int(s[:i]),int(s[i:i+j])] print(ans,(i,j)) if helper(i+j): return ans if s[i] == '0': break if s[0] == '0': break return
因為題目規定了最大整數不超過2147483647
,所以為了方便後續的判斷,將其賦值給up變數;於是我們開始列舉第乙個和第二個數,注意最大值的長度不超過10個,因此遍歷第乙個數隻需要
range(1,11)
,第二個數的長度一定小於n-第乙個數字的長度,因此遍歷第二個數隻需要range(1,min(11,n-i))
,於是就確定了前兩個數字。
完成這些後,借助helper函式去確定第三個數,因為第二個數的範圍使用了s[i:i+j]
所以,列舉第三個數字時就應該從i+j開始。
對於helper函式來說,我們記第乙個數+第二個數為now變數;若
第三個數滿足斐波那契數列
,所以第三個數的長度一定等於now的長度。所以只需取s的切片s[start:start+c],判斷其是否等於now。如果等於,說明前兩個數和第三個數已確定,記下來去查詢第四個數是否滿足條件;如果不等於,則說明第二個數枚舉的不對,繼續列舉。
可以在迴圈的時候列印print(ans,(i,j))
,(以s="123456579")如下所示:
[1, 2] (1, 1)[1, 23] (1, 2)[1, 234] (1, 3)[1, 2345] (1, 4)[1, 23456] (1, 5)[1, 234565] (1, 6)[1, 2345657] (1, 7)[12, 3] (2, 1)[12, 34] (2, 2)[12, 345] (2, 3)[12, 3456] (2, 4)[12, 34565] (2, 5)[12, 345657] (2, 6)[123, 4] (3, 1)[123, 45] (3, 2)[123, 456] (3, 3)
Leetcode 842 將陣列拆分成斐波那契序列
給定乙個數字字串 s,比如 s 123456579 我們可以將它分成斐波那契式的序列 123,456,579 形式上,斐波那契式序列是乙個非負整數列表 f,且滿足 0 f i 2 31 1,也就是說,每個整數都符合 32 位有符號整數型別 f.length 3 對於所有的0 i f.length 2...
842 將陣列拆分成斐波那契序列
給定乙個數字字串 s,比如 s 123456579 我們可以將它分成斐波那契式的序列 123,456,579 形式上,斐波那契式序列是乙個非負整數列表 f,且滿足 0 f i 2 31 1,也就是說,每個整數都符合 32 位有符號整數型別 f.length 3 對於所有的0 i f.length 2...
將字串拆分為陣列
根據符號分string s1 sdsad,3232 222.ssss string s2 s1.split foreach string s3 in s2 console.readkey 去除空字元 string s4 aa,bb,cc,dd,string s5 s4.split new char,...