问题描述:
报数指的是,按照其中的整数的顺序进行报数,然后得到下一个数。如下所示:
1, 11, 21, 1211, 111221, ...
1
读作 "one 1"
-> 11
.
11
读作 "two 1s"
-> 21
.
21
读作 "one 2, then one 1"
-> 1211
.
给定一个整数 n
, 返回 第 n
个顺序。
样例:
给定 n = 5
, 返回 "111221"
注意事项
整数的顺序将表示为一个字符串。
我的思路:
先根据题目找出规律:1读作一个1(11);
11读作两个1(21);
21读作一个2一个1(1211);
可以看出来11中第一个1表示相同数字的个数,第二个1表示该相同的数字后面的以此类推。
我先把21看做一个字符串,把它转换成字符数组,然后用两个循环,第一层循环主要用来记住该相同的数字,第二层循环统计相同数字的个数,
如果该数字和他的下一个数字相同,个数加一,在判断下一个数字,如果不相等,记住第二个数字的位置,用i表示,把j的位置赋给i,下一次
循环从j的位置开始,这里j-1的原因是进行下一次(第一层)循环时,i++,所以把j-1的值赋给i.跳出第二层循环,用result记住现在得出的字符串。
在返回字符串之前进行判断,是因为最后两个数字相同时,会多循环一次。所以将最后两个数字删除。
这里用到了StringBuffer,主要是觉得连接两个数字比较方便,也可以直接使用字符串。
代码:
public class Solution { /* * @param n: the nth * @return: the nth sequence */ public String countAndSay(int n) { // write your code here String result="1"; if(n==1){ return "1"; } while(n>1){ result=dealString(result); n--; } return result; } public String dealString(String str){ StringBuffer result=new StringBuffer(); char []c=str.toCharArray(); for(int i=0;i<c.length;i++){ int count=1; for(int j=i+1;j<c.length;j++){ if(c[i]==c[j]){ count++; }else{ i=j-1; break;//跳出里层循环 } } result.append(count); result.append(c[i]); continue; } String s=result.toString(); if(c.length>1&&c[c.length-1]==c[c.length-2]){ s=s.substring(0, s.length()-2); } return s; } public static void main(String []args){ Solution solution=new Solution(); System.out.println(solution.countAndSay(5)); } }