题目链接
题目解析
下一行是对上一行的解释
给一个n,返回它对第n个外观数组的描述
算法原理
模拟+双指针 , 给一个字符串就解释一下
我们找到一个相同的部分就进行解释, 借助双指针
相同right就往后移动
然后计算这个区间里面的元素个数: count = right - left, 说明这个区间内有count个left所指向的元素
然后让left指向right所指的位置, 继续移动right
代码编写
只使用String
public String countAndSay(int n) {
if (n == 1) {
return "1";
}
String s = "1";
for (int i = 2; i <= n; i++) {
int len = s.length();
int left = 0, right = 0;// left,right一开始都先指向字符串第一个位置
// 临时值
String tmp = "";
// 遍历len
for (int j = 0; j < len; j++) {
while (left < len && right < len && s.charAt(right) == s.charAt(left)) {
right++;
}
// 此时出来,说明right走到其他数字上了,我们就需要进行描述了
int count = right - left;// 数字出现的次数
// 提前结束
if (right >= len && left >= len) {
break;
}
// 进行拼接操作
tmp += count;// 出现了多少次
tmp += s.charAt(left);// 哪个数字
// 更新left
left = right;
}
// 更新s
s = tmp.substring(0);
}
return s;
}
使用StringBuilder
class Solution {
public String countAndSay(int n) {
if (n == 1) {
return "1";
}
String s = "1";
for (int i = 2; i <= n; i++) {
int len = s.length();
int left = 0, right = 0;// left,right一开始都先指向字符串第一个位置
// 临时值
StringBuilder tmp = new StringBuilder();
// 遍历len
for (int j = 0; j < len; j++) {
while (left < len && right < len && s.charAt(right) == s.charAt(left)) {
right++;
}
// 此时出来,说明right走到其他数字上了,我们就需要进行描述了
int count = right - left;// 数字出现的次数
// 提前结束
if (right >= len && left >= len) {
break;
}
// 进行拼接操作
tmp.append(count);
tmp.append(s.charAt(left));// 哪个数字
// 更新left
left = right;
}
// 更新s
s = tmp.toString();
}
return s;
}
}
对象.toString可以把任意对象->String类型