日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode之Count and Say报数

發(fā)布時間:2025/3/16 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode之Count and Say报数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接:Count and Say報數(shù)

一開始試圖找規(guī)律,直接寫了個簡單粗暴的代碼,跑起來好像沒發(fā)現(xiàn)規(guī)律。

試著提交居然過了,但是速度比較慢,就改進(jìn)了下代碼。

按題意來的簡單粗暴的代碼(40ms)如下:

public String countAndSay(int n) {List<Integer> arr = new ArrayList<Integer>();List<Integer> res = new ArrayList<Integer>();arr.add(1); // 初始化數(shù)列for (int i = 2; i <= n; i++) {int count = 0, pre = -1;? ? // 用pre存儲數(shù)列中arr(k)的前一個數(shù)for (int k = 0; k < arr.size(); k++) {// 判斷前一個數(shù)是否與當(dāng)前數(shù)相等,是則count+1// 否則將count與pre存入res,重置count,preif (((Integer)arr.get(k)) != pre) {if (count > 0) {res.add(count);res.add(pre);}count = 1;pre = arr.get(k);} else count++;}res.add(count);res.add(pre);arr.clear();? ? // 將arr清空arr.addAll(res);? ? // 將res數(shù)列復(fù)制到arr中res.clear();? ? // 將res清空}StringBuilder ans = new StringBuilder();// 遍歷數(shù)列已返回結(jié)果for (Integer a : arr) ans.append(a);return ans.toString(); }

之后做了一些改進(jìn)(5ms),這樣的改進(jìn),測試數(shù)據(jù)組數(shù)越多,效果越明顯

public class CountAndSay { /*改進(jìn):* 1.第一次提交后發(fā)現(xiàn)n貌似不是特別大* n范圍好像是1--57* 所以可以使用一個List<StringBuilder>來* 存我們求n時計算的n-1,n-2,....,3,2,1避免了一些重復(fù)計算* 2.直接使用StringBuilder,* 比List<Integer>轉(zhuǎn)String減少了個循環(huán),* 3.至于為何不直接用String,* 這樣StringBuilder到toString都免了,* 請自行百度StringBuilder與String順帶個StringBuffer* */ private static List<StringBuilder> list = new ArrayList<StringBuilder>(60);static {list.add(new StringBuilder("1")); }public String countAndSay(int n) {if (list.size() > n - 1) {if (n - 1 < 0) return null;return ((StringBuilder)list.get(n - 1)).toString();} else {StringBuilder arr = (StringBuilder)list.get(list.size() - 1);StringBuilder res = new StringBuilder();for (int i = list.size(); i < n; i++) {int count = 0;char pre = 0;for (int k = 0; k < arr.length(); k++) {if (arr.charAt(k) != pre) {if (count > 0) res.append(count).append(pre);count = 1;pre = arr.charAt(k);} else count++;}res.append(count).append(pre);arr = res;res = new StringBuilder(); list.add(arr);}return arr.toString();} } }

總結(jié)

以上是生活随笔為你收集整理的leetcode之Count and Say报数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。