leetcode:LCR 135. 报数.剑指offer打印从1到最大的n位数

时间:2024-04-20 07:12:05

实现一个十进制数字报数程序,请按照数字从小到大的顺序返回一个整数数列,该数列从数字 1 开始,到最大的正整数 cnt 位数字结束。

示例 1:

输入:cnt = 2
输出:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99]

知识点:

calloc 是 C 语言标准库中的一个函数,用于动态地分配内存空间,并将该内存空间初始化为零。它在使用动态内存分配时非常有用,特别是当需要确保分配的内存块的每个字节都是零时。

calloc 的函数原型如下:

void *calloc(size_t num_elements, size_t element_size);

参数解释:

  • num_elements:要分配的元素数量。

element_size:每个元素的大小(以字节为单位)。

atoi 是 C 语言标准库中的一个函数,用于将字符串转换为整数。函数名称 atoi 代表 "ASCII to Integer",它将字符串中的数字字符转换为对应的整数。

字符串实现大数输出

索引index从0开始,字符串长度小于n,

//回溯
void DFS(char** nums,char* str,int end,int index,int* returnSize)
{
    if(index==end)
    {
        nums[(*returnSize)] = malloc(sizeof(char)*(end+1));
        //去零,此处需要判断是否全为0,把多余的0去掉
        while(str[0]=='0')str++;
        //非0的部分加入。
        if(str[0]!=0)strcpy(nums[(*returnSize)++],str);
        return;
    }
    for(int i=0;i<=9;i++)
    {
        str[index] = i+'0';
        //必须有结束符,不然strcpy越界
        str[index+1] = '\0';
        DFS(nums,str,end,index+1,returnSize);
    }

}
int* countNumbers(int cnt, int* returnSize){
    * returnSize =  0;
    int* nums_c = calloc(pow(10,cnt),sizeof(int));
    char** nums = malloc(sizeof(char*)*(pow(10,cnt)+1));
    char* str = malloc(sizeof(char)*(cnt+1));
    DFS(nums,str,cnt,0,returnSize);
    //字符串转化
    for(int i=0;i<*returnSize;i++)
    {
        nums_c[i] = atoi(nums[i]);
    }
    return nums_c;
}



使用递归的思想,依次构建个位、十位、百位……