原标题:每日一题31
每日一题
编程语言的学习,绝非一朝一夕,没有成千上万代码的累计是不可能的。——Dennis Ritchie(C语言之父)
我们每个人都应该会编程,因为它教你如何思考。——apple创始人 史蒂夫.乔布斯
题目描述
(leetcode报数Count and Say)
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。第一项存入一个字符‘1’,那么你就从第二项开始描述前一项的字符,例如:第一项‘1’,那么第二项就为‘11’表示‘1个1’,第三项为‘21’表示‘2个1’。其前五项如下:
1
11
21
1211
111221
1 被读作 “one 1” (“一个一”) , 即 11。
11 被读作 “two 1s” (“两个一”), 即 21。
21 被读作 “one 2”, “one 1” (“一个二” , “一个一”) , 即 1211。
给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
题目解析
我们可以统计相同数字出现的次数,比如前一项有这样一串字符‘1113334’,那么我们就可以统计 1 出现的次数为 3 ,3 出现的次数 3 ,4 出现的次数 1 ,所以下一项就为‘3 1 3 3 1 4’,大概就是每一个字符出现的次数 + 字符
char* countAndSay(intn){
char* str = (char*)malloc(sizeof(char) * 1000000);
chartempChar[1000000];
str[0] = '1';
intk = 0;
for(inti = 1;i < n;i++)
{
for(intj = 0,count = 1;j < strlen(str);j++, count = 1)
{
while(str[j] == str[j+1]) //统计字符出现次数
{
count++;
j++;
}
tempChar[k++] = count + '0'; //分别将字符次数和字符存入一个临时字符数组
tempChar[k++] = str[j];
}
tempChar[k] = '0'; //记得在最后加上结尾符
strcpy(str, tempChar);
k = 0; //重置临时字符数组下标
}
returnstr;
}
为了让大多数人学习理解,关于每日一题中我们给出的解法是最通俗易懂的,也就是大家最容易想到的,但这可能不是最优解,解体技巧和时空复杂度的考虑可能会有欠缺,学有余力的读者可以试着给出其他解法与小编交流。
2
责任编辑: