外观数列 是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:
1 11 21 1211 1112211 被读作 “one 1” (“一个一”) , 即 11。 11 被读作 “two 1s” (“两个一”), 即 21。 21 被读作 “one 2”, “one 1” (“一个二” , “一个一”) , 即 1211。 给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。 注意:整数序列中的每一项将表示为一个字符串。1
求解思路:
每次与之前元素比较是否相同; 1.1若相同次数加一 1.2若不同,更新数据(sb.append(),重新计数)最后更新之前元素Java代码
public String countAndSay(int n) { if(n < 0) return null; if(n == 1) return "1"; String str = "1"; for (int i = 2;i<= n;i++){ //每做一次从0开始计数 int count = 0; char c = '.'; StringBuilder sb = new StringBuilder(); for (int j = 0;j<str.length();j++){ if(str.charAt(j) == c|| c== '.'){ //当第j个元素和之前元素相同时 count ++; }else{ //当第j个元素和之前元素不同时 //将之前记录的元素加进去 sb.append(count + Character.toString(c)); //记录当前元素的个数 count = 1; } //记录最新的元素 c= str.charAt(j); } //最后一个记录的情况并未加进去 //最后一次 sb.append(count + Character.toString(c)); str = sb.toString(); } return str; }https://leetcode-cn.com/problems/count-and-say/ ↩︎