Count and Say
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
.
Given an integer n, generate the nth sequence.
Note: The sequence of integers will be represented as a string.
题意是n=1时输出字符串1;n=2时,数上次字符串中的数值个数,因为上次字符串有1个1,所以输出11;n=3时,由于上次字符是11,有2个1,所 以输出21;n=4时,由于上次字符串是21,有1个2和1个1,所以输出1211。依次类推,写个countAndSay(n)函数返回字符串。
C语言超时,代码如下:
char *countAndSay(int n) { if(n <= 0) return NULL; int count = 1,k = 0;; char *say1 = (char*) malloc(sizeof(char)*100000); char *say2 = (char*) malloc(sizeof(char)*100000); say1[0] = '1'; char last = say1[0]; for(int i = 1; i<n; i++){ k = 0; if(i%2){ for(int j = 0; j<strlen(say1); j++){ if(say1[j] == last){ count++; }else{ say2[k++] = (char)(count+'0'); say2[k++] = last; count = 1; last = say1[j]; } } say2[k] = '0'; }else{ for(int j = 0; j<strlen(say2); j++){ if(say2[j] == last){ count++; }else{ say1[k++] = (char)(count+'0'); say1[k++] = last; count = 1; last = say2[j]; } } say1[k] = '\0'; } } if(n%2) return say1; return say2; }
C++代码如下:
class Solution { public: string unguarded_convert(const string &say) { stringstream ss; int count = 0; char last = say[0]; for (size_t i = 0; i <= say.size(); ++i) { if (say[i] == last) { ++count; } else { ss << count << last; count = 1; last = say[i]; } } return ss.str(); } string countAndSay(int n) { if (n <= 0) return string(); string say = "1"; for (int i = 1; i < n; ++i) { say = unguarded_convert(say); } return say; } };