ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DeepSeek 专家 LeetCode 38. 外观数列 C语言实现

DeepSeek 专家    LeetCode 38. 外观数列 C语言实现 以下是 LeetCode 38. 外观数列 的 C 语言实现采用迭代生成的方法每次根据当前项生成下一项直到得到第 n 项。思路外观数列的每一项都是对前一项的“读法”描述· 从第一项 “1” 开始· 遍历当前字符串统计连续相同字符的个数并将“个数 字符”拼接到新字符串中· 重复该过程 n-1 次即可得到第 n 项。例如· 第 1 项“1”· 第 2 项一个 1 → “11”· 第 3 项两个 1 → “21”· 第 4 项一个 2、一个 1 → “1211”· 第 5 项一个 1、一个 2、两个 1 → “111221”代码实现#includestdio.h#includestdlib.h#includestring.hchar*countAndSay(intn){// 第 1 项直接返回if(n1){char*res(char*)malloc(2);strcpy(res,1);returnres;}// 分配足够大的缓冲区第 30 项长度不超过 10000足够安全intcapacity10000;char*cur(char*)malloc(capacity);char*next(char*)malloc(capacity);strcpy(cur,1);// 迭代生成第 2 到第 n 项for(intstep1;stepn;step){intlen0;intcurLenstrlen(cur);for(inti0;icurLen;){chardigitcur[i];intcount0;// 统计连续相同字符个数while(icurLencur[i]digit){i;count;}// 将“个数 字符”追加到 next 中lensprintf(nextlen,%d%c,count,digit);}next[len]\0;// 交换 cur 和 next准备下一轮char*tempcur;curnext;nexttemp;}// 释放多余缓冲区返回最终结果free(next);returncur;// 调用者负责 free}复杂度分析· 时间复杂度O(m)其中 m 是第 n 项的长度。每一项的生成都需要遍历前一项总长度呈指数增长但 n ≤ 30实际计算量很小。· 空间复杂度O(m)使用了两个缓冲区每个大小固定为 10000足够容纳第 30 项实际可动态调整。说明· 使用 sprintf 将整数 count 转为字符串并追加到缓冲区简单直观。· 由于题目 n 的最大值为 30第 30 项长度约 5808 个字符因此分配 10000 字节的缓冲区绝对安全且不会造成过大内存浪费。· 返回的字符串由 malloc 分配调用者需要 free 释放符合 LeetCode 的要求。· 如果希望更精确地管理内存可以在每次迭代时计算所需长度并动态分配但本实现已足够通过评测。
返回列表