题目:报数
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
1 11 21 1211 111221
1 被读作 “one 1” (“一个一”) , 即 11。
11 被读作 “two 1” (“两个一”), 即 21。
21 被读作 “one 2”, “one 1” (“一个二” , “一个一”) , 即 1211。
给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
示例 1:
输入: 1
输出: “1”
示例 2:
输入: 4
输出: “1211”
C语言解题
char* countAndSay(int n) {
char bak[100000] = {};
char tmp[100000] = {};
char* seq = (char*)malloc(sizeof(char) * 100000);
int top = 1, i, index, num ;
seq[0] = '1';
seq[1] = 0;
bak[0] = '1';
bak[1] = 0;
while (--n) {
index = 0;
for (i = 0; i < top; i++) {
num = 1;
while (i + 1 < top && bak[i + 1] == bak[i]) {
i++;
num++;
}
seq[index] = num + '0';
tmp[index] = num + '0';
index++;
seq[index] = bak[i];
tmp[index] = bak[i];
index++;
}
seq[index] = 0;
tmp[index] = 0;
strcpy(bak,tmp);
top = index;
}
return seq;
}
本来想用两个指针seq和bak(char*)malloc(sizeof(char) * 100000),但是while循环一次中更新bak时(bak=seq),由于是指针,会指向同一地址,for循环内的计数就会因为有更新而出错。
使用了两个字符串数组,更新时与地址无关,解决了问题。