外观数列的前几项如下:
import java.util.*; public class Solution { /** * * @param n int整型 * @return string字符串 */ public String countAndSay (int n) { // write code here if (n == 1) { return "1"; } StringBuilder res = new StringBuilder(); String str = countAndSay(n - 1); int cur = 0; char first = str.charAt(0); for (int i = 0; i < str.length(); i++) { // 如果遍历到最后一个且相等,则前面的数字为 i - cur + 1,如 1 1 2 2 2 if (i == str.length() - 1 && str.charAt(i) == str.charAt(cur)) { res.append(i - cur + 1).append(str.charAt(cur)); break; } // 如果遍历到最后一个且不相等,则要拼接 i - cur 个 str[cur],和 1 个 str[end],如 1 1 2 2 3 else if (i == str.length() - 1 && str.charAt(i) != str.charAt(cur)) { res.append(i - cur).append(str.charAt(cur)); res.append(1).append(str.charAt(i)); break; } // 其余不相等情况则直接拼接之前的 else if (str.charAt(i) != str.charAt(cur)) { res.append(i - cur).append(str.charAt(cur)); cur = i; } } return res.toString(); } }
public String countAndSay(int n) {
if (n<1)
return "";
int i=1;
StringBuilder last=new StringBuilder();
last.append(1);
while (i<n){
char[] cs =last.toString().toCharArray();
StringBuilder c=new StringBuilder();
int count=1;
for (int j = 0; j <cs.length; j++) {
if(j+1<cs.length&&cs[j]==cs[j+1]){
count++;
}else{
c.append(count);
c.append(cs[j]);
count=1;
}
}
last=c;
i++;
}
return last.toString();
}
/*解题思路:每次读取前一次序列结果的时候,通过循环遍历这个序列,设置一个计数标志count, 初始值置为 1,其代表序列中每个字符出现次数为1,遍历序列,若相邻的两个字符相等, 则执行count++操作;否则将“count(次数)+字符”组成的字符串追加到结果字符串后面。 注意:使用String会运行超时,因为其存在大量拼接字符串时产生很多中间对象问题, 因此采用StringBuilder或者StringBuffer */ public class Solution { public String countAndSay(int n) { if(n < 0) return ""; StringBuilder str = new StringBuilder("1"); for(int i = 1; i < n; i++){ int count = 1; StringBuilder t = new StringBuilder(); int len = str.length(); for(int j = 1; j < len; j++){ if(str.charAt(j) == str.charAt(j-1)){ count ++; } else{ t.append(count).append(str.charAt(j-1)); count = 1; } } //读序列的最后一个字符 t.append(count).append(str.charAt(len - 1)); str = t; } return str.toString(); } }
public class CountAndSay { public static void main(String[] args) { CountAndSay say = new CountAndSay(); System.out.println(say.countAndSay(4)); } public String countAndSay(int n) { String res="1"; for(int i=n-1;i>0;i--){ res=count(res); } return res; } public String count(String res){ char c=res.charAt(0); int num=1; StringBuilder sb = new StringBuilder(); for(int i=1;i<res.length();i++){ if(res.charAt(i)==c){ num++; continue; } sb.append(String.valueOf(num)+c); c=res.charAt(i); num=1; } sb.append(String.valueOf(num)+c); return sb.toString(); } } raodanwohaishixihuanni
public String countAndSay(int n) { if(n==1) return "1"; String pre = countAndSay(n-1); StringBuilder sb = new StringBuilder(); char ch = pre.charAt(0); int cnt = 1; for(int i=1;i<pre.length();i++){ char t = pre.charAt(i); if(t == ch) cnt ++ ; else{ sb.append(cnt).append(ch); ch = t; cnt = 1; } } sb.append(cnt).append(ch); return sb.toString(); }
题意比较难理解,大致意思就是对上一个序列进行查数:
n=1时,序列为:1;
n=2时,序列为:11;(一个"1")
n=3时,序列为:21;(两个“1”)
n=4时,序列为:1211;(一个“2”,两个“1”)
n=5时,序列为:111221;(一个“1”,一个“2”,两个“1”)
import java.util.*; public class Solution { public String countAndSay(int n) { if(n < 1) return ""; StringBuffer res =new StringBuffer("1"); StringBuffer tmp; int i = 1; while(i < n) { tmp = getNext(res); res = tmp; i++; } return res.toString(); } public StringBuffer getNext(StringBuffer sb) { char c = sb.charAt(0); int num=1; StringBuffer res = new StringBuffer(); for(int i=1; i<sb.length(); i++){ if(sb.charAt(i)==c){ num++; continue; } res.append(num); res.append(c); c=sb.charAt(i); num=1; } res.append(num); res.append(c); return res; } }