Open carloscn opened 1 year ago
static int32_t gen_str(char *out)
{
int32_t ret = 0;
size_t in_len = 0;
size_t count = 1;
size_t i = 0;
char e = 0;
char c = 0;
char *in_str = NULL;
UTILS_CHECK_PTR(out);
UTILS_CHECK_LEN(in_len = strlen(out));
in_str = (char *)malloc(in_len + 1);
UTILS_CHECK_PTR(in_str);
strcpy(in_str, out);
for (i = 0; i < in_len; i ++) {
e = in_str[i];
c = in_str[i + 1];
if (e == c) {
count ++;
} else {
*(out ++) = count + '0';
*(out ++) = e;
count = 1;
}
}
finish:
UTILS_SAFE_FREE(in_str);
return ret;
}
static int32_t count_and_say(size_t n, char *in)
{
int32_t ret = 0;
size_t i = 0;
UTILS_CHECK_PTR(in);
UTILS_CHECK_LEN(n);
strcpy(in, "1");
for (i = 1; i < n; i ++) {
ret = gen_str(in);
UTILS_CHECK_RET(ret);
}
finish:
return ret;
}
fn gen_str(in_str:&String) -> String
{
let mut ret_str:String = String::new();
let mut dup_in_str = String::from(in_str);
let in_chars:Vec<char>;
let mut i:usize = 0;
let mut count:usize = 1;
dup_in_str.push('\0');
in_chars = dup_in_str.chars().collect();
while i < in_str.len() {
let e = &in_chars[i];
let c = &in_chars[i + 1];
if *e == *c {
count += 1;
} else {
ret_str.push(char::from_digit(count as u32, 10).unwrap());
ret_str.push(*e);
count = 1;
}
i += 1;
}
return ret_str;
}
fn count_and_say(n:usize) -> String
{
let mut ret_str:String = String::new();
let mut i:usize = 1;
if 0 == n {
return ret_str;
}
ret_str.push('1');
if 1 == n {
return ret_str;
}
while i < n {
ret_str = gen_str(&ret_str);
i += 1;
}
return ret_str;
}
问题描述
给定一个正整数 n ,输出外观数列的第 n 项。
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。
你可以将其视作是由递归公式定义的数字字符串序列:
countAndSay(1) = "1" countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。 前五项如下:
要描述一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。
例如,数字字符串 "3322251" 的描述如下图:
示例 1:
输入:n = 1 输出:"1" 解释:这是一个基本样例。 示例 2:
输入:n = 4 输出:"1211" 解释: countAndSay(1) = "1" countAndSay(2) = 读 "1" = 一 个 1 = "11" countAndSay(3) = 读 "11" = 二 个 1 = "21" countAndSay(4) = 读 "21" = 一 个 2 + 一 个 1 = "12" + "11" = "1211"
提示:
1 <= n <= 30
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/count-and-say