题目来源于力扣–https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnpvdm/
当时想用c语言实现,但是没有想到好的方法,就用java来实现。
原理就是,首先将字符串首位元素取出,依次和后边的元素进行比较,
1、如果相等我们就用一个计数器count来保存出现的次数,每出现一次,计数器就加一。
2、如果遇到不相等的元素,首先将计数器count和元素添加进字符串,然后将计数器置为0,将当前元素保存继续判断1。
3、直到字符串结束。
此时就可以用双层循环,一层控制n,一层控制字符串长度。
代码如下:
public String countAndSay(int n) {
// 临时字符串
StringBuilder str;
// 初始化字符串
StringBuilder temp = new StringBuilder("1");
// 计数器
int count;
// 如果为1直接返回
if(n==1){
return "1";
}
// 非1的情况,所以只需要循环n-1次,第一次肯定是"1",这一次不需要进行了。
for(int k=1;k<n;k++){
// 字符串赋值给临时字符串
str = temp;
// 初始化
temp = new StringBuilder();
// 计数器置为1,保底有一个
count = 1;
// 将首元素取出
char c = str.charAt(0);
// 从字符串第二个元素开始判断
for(int j=1;j<str.length();j++){
// 如果两个元素相等的话
if(c==str.charAt(j)){
// 计数器加一
count++;
}else{
// 此时发现了新元素,上个元素的个数与元素添加进字符串
temp.append(count).append(c);
// 计数器重新计数
count = 1;
// c置为新元素
c = str.charAt(j);
}
}
// 这边是防止字符串结束的时候,最后一个元素的个数与元素也要添加进来,防止漏掉。
temp.append(count).append(c);
}
// 返回字符串
return temp.toString();
}