<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
累加數 是一個字串,組成它的數位可以形成累加序列。
一個有效的 累加序列 必須 至少 包含 3 個數。除了最開始的兩個數以外,序列中的每個後續數位必須是它之前兩個數位之和。
給你一個只包含數位 '0'-'9' 的字串,編寫一個演演算法來判斷給定輸入是否是 累加數 。如果是,返回 true ;否則,返回 false 。
說明:累加序列裡的數,除數位 0 之外,不會 以 0 開頭,所以不會出現 1, 2, 03 或者 1, 02, 3 的情況。
輸入:"112358"
輸出:true
解釋:累加序列為: 1, 1, 2, 3, 5, 8 。1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
輸入:"199100199"
輸出:true
解釋:累加序列為: 1, 99, 100, 199。1 + 99 = 100, 99 + 100 = 199
提示:
1 <= num.length <= 35
num 僅由數位(0 - 9)組成
一個累加序列,當它的第一個數位和第二個數位以及總長度確定後,這整個累加序列也就確定了。
根據這個性質,我們可以窮舉累加序列的第一個數位和第二個數位的所有可能性,對每個可能性,進行一次合法性的判斷。
當出現一次合法的累加序列後,即可返回true。
當所有可能性都遍歷完仍無法找到一個合法的累加序列時,返回 false。
class Solution { public boolean isAdditiveNumber(String num) { int n = num.length(); for (int secondStart = 1; secondStart < n - 1; ++secondStart) { if (num.charAt(0) == '0' && secondStart != 1) { break; } for (int secondEnd = secondStart; secondEnd < n - 1; ++secondEnd) { if (num.charAt(secondStart) == '0' && secondStart != secondEnd) { break; } if (valid(secondStart, secondEnd, num)) { return true; } } } return false; } public boolean valid(int secondStart, int secondEnd, String num) { int n = num.length(); int firstStart = 0, firstEnd = secondStart - 1; while (secondEnd <= n - 1) { String third = stringAdd(num, firstStart, firstEnd, secondStart, secondEnd); int thirdStart = secondEnd + 1; int thirdEnd = secondEnd + third.length(); if (thirdEnd >= n || !num.substring(thirdStart, thirdEnd + 1).equals(third)) { break; } if (thirdEnd == n - 1) { return true; } firstStart = secondStart; firstEnd = secondEnd; secondStart = thirdStart; secondEnd = thirdEnd; } return false; } public String stringAdd(String s, int firstStart, int firstEnd, int secondStart, int secondEnd) { StringBuffer third = new StringBuffer(); int carry = 0, cur = 0; while (firstEnd >= firstStart || secondEnd >= secondStart || carry != 0) { cur = carry; if (firstEnd >= firstStart) { cur += s.charAt(firstEnd) - '0'; --firstEnd; } if (secondEnd >= secondStart) { cur += s.charAt(secondEnd) - '0'; --secondEnd; } carry = cur / 10; cur %= 10; third.append((char) (cur + '0')); } third.reverse(); return third.toString(); } }
時間複雜度:o(n^3)
空間複雜度:o(n)
對字串num進行回溯,回溯過程中擷取字串diff,如果diff的首字元是'0',則不進行處理,否則判斷前兩個元素相加是否能得到diff
由於num.length的範圍在[1, 35],所以如果用long儲存的話,最終可能會超限,所以這裡使用字串陣列記錄。
記錄過程中類似於兩數相加,最後將較長的那個陣列拼在結果陣列中。 對最終陣列進行進位處理。
func add(a, b string) string { res, one := []byte{}, 0 for i, j := len(a) - 1, len(b) - 1 ; i >= 0 || j >= 0 ; { curA, curB := 0, 0 if i >= 0 { curA = int(a[i] - '0') i-- } if j >= 0 { curB = int(b[j] - '0') j-- } cur := curA + curB + one one = cur/10 res = append(res, byte(cur%10)+'0') } if one == 1 { res = append(res, '1') } for i, n := 0, len(res); i < n/2; i++ { res[i], res[n-1-i] = res[n-1-i], res[i] } return string(res) } func dfs(num string, first, second int) bool { n, last := len(num), 0 for second < n { if (num[last] == '0' && first > last + 1) || (num[first] == '0' && second > first + 1){ return false } s := add(num[last:first], num[first:second]) if second + len(s) > n || num[second:second + len(s)] != s { return false } last, first, second = first, second, second + len(s) } return true } func isAdditiveNumber(num string) bool { for i:=1;i<len(num)-1;i++ { for j:=i+1;j<len(num);j++{ if dfs(num, i, j){ return true } } } return false }
以上就是Go Java演演算法之累加數範例詳解的詳細內容,更多關於Go Java演演算法累加數的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45