题目
教你怎么数数
1
1 读作:1个1;写作:11
11 读作:2个1;写作:21
21 读作:1个2,1个1;写作:1211
……
问:第n行写作什么?
The count-and-say sequence is the sequence of integers beginning as follows:
1, 11, 21, 1211, 111221, ...
1 is read off as "one 1" or 11.
11 is read off as "two 1s" or 21.
21 is read off as "one 2, then one 1" or 1211.
https://leetcode.com/problems...
算法
思路:暴力枚举,数数
-
边界条件
最后一个被比较对象没有被记录,因此退出循环后要加进去
-
不能写作 s+=1+'a';
会先算等式右边的,右边的就变成int类型了,先变成98,再加进s里,结果就惨不忍睹
正确写法是 s=s+1+'a';
尝试
public String countAndSay(int n) {
int start = 0;
String re = "1";
char[] ch=re.toCharArray();
for (int i = 1; i <= n - 1; i++) {
start=0;
ch = re.toCharArray();
re = "";
for (int j = 0; j < ch.length; j++) {
if (ch[j] != ch[start]) { //这样子写很方便,不用在两个字符相等的时候用另外的变量count去计数,如果相同的话j就会移动了,j就是那个计数器。但是虽然没有count,却需要一个起点start,不过只需要记录一次就可以了。
re = re + (j - start) + ch[start];
start = j;
}
}
re = re + (ch.length - start) + ch[start]; //最后一个没有被记录
}
return re;
}
借鉴
StringBuilder 快很多
public String countAndSay(int n) {
int start = 0;
StringBuilder re = new StringBuilder("1");
char[] ch;
for (int i = 1; i <= n - 1; i++) {
start=0;
ch = re.toString().toCharArray();
re = new StringBuilder();
for (int j = 0; j < ch.length; j++) {
if (ch[j] != ch[start]) {
re.append(j-start);
re.append(ch[start]);
start = j;
}
}
re.append(ch.length-start);
re.append(ch[start]);
}
return re.toString();
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。