拷打字节算法面试官之-深入c语言递归算法

继续更新拷打面试官系列:c语言 递归算法系列7

***附录:5*200-> 1000行源码 

1 无重复的字符串全排列:

// /**
//  * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
//  *
//  *
//  * @param num int整型一维数组
//  * @param numLen int num数组长度
//  * @return int整型二维数组
//  * @return int* returnSize 返回数组行数
//  * @return int** returnColumnSizes 返回数组列数
//  */

// //  #2刷
// int compareFn(const void *a, const void *b)
// {
//     return *(int *)a - *(int *)b;
// }

// void doFunc(int *num, int numLen, int **res, int *returnSize, int *path, int depth, int *used)
// {
//     // if (depth == numLen)
//     // {
//     //     res[*returnSize] = (int *)malloc(numLen * sizeof(int));
//     //     for (int i = 0; i < numLen; i++)
//     //     {
//     //         res[*returnSize][i] = path[i];
//     //     }
//     //     (*returnSize) += 1;
//     // }
//     // else
//     // {
//     //     for (int i = 0; i < numLen; i++)
//     //     {
//     //         if (used[i] != 1)
//     //         {
//     //             used[i] = 1;
//     //             path[depth] = num[i];
//     //             doFunc(num, numLen, res, returnSize, path, depth + 1, used);
//     //             used[i] = 0;
//     //         }
//     //     }
//     // }

//     // #3刷
//     if (depth == numLen)
//     {
//         res[*returnSize] = (int *)malloc(numLen * sizeof(int));
//         for (int i = 0; i < numLen; i++)
//         {
//             res[*returnSize][i] = path[i];
//         }
//         (*returnSize)++;
//     }
//     else
//     {
//         for (int i = 0; i < numLen; i++)
//         {
//             if (used[i] == 0)
//             {
//                 used[i] = 1;
//                 path[depth] = num[i];
//                 doFunc(num, numLen, res, returnSize, path, depth + 1, used);
//                 used[i] = 0;
//             }
//         }
//     }
// }

// int **permute(int *num, int numLen, int *returnSize, int **returnColumnSizes)
// {
//     // write code here

//     // 2025.7.9 3:06am
//     // # 2刷
//     // res是结果的二维数组,returnSize返回的大小,path目前的路径,depth是路径深度,used用来标记已经访问的数组
//     int total = 1;
//     for (int i = 1; i <= numLen; i++)
//     {
//         total *= i;
//     }
//     int depth = 0;
//     int **res = (int **)malloc(total * sizeof(int *));
//     int *path = (int *)malloc(numLen * sizeof(int));
//     int *used = (int *)calloc(numLen, sizeof(int));
//     qsort(num, numLen, sizeof(int), compareFn);
//     *returnSize = 0;
//     doFunc(num, numLen, res, returnSize, path, depth, used);

//     *returnColumnSizes = (int *)malloc((*returnSize) * sizeof(int));
//     for (int i = 0; i < *returnSize; i++)
//     {

//         (*returnColumnSizes)[i] = numLen;
//     }
//     return res;
// }

/// 3刷
//!!!vip #self
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param num int整型一维数组
 * @param numLen int num数组长度
 * @return int整型二维数组
 * @return int* returnSize 返回数组行数
 * @return int** returnColumnSizes 返回数组列数
 */

void fun(int *num, int numLen, int **res, int *used, int *temp, int pos, int *returnSize, int **returnColumnSizes)
{
    // 3刷
    //  if (pos == numLen)
    //  {
    //      for (int i = 0; i < numLen; i++)
    //      {
    //          res[*returnSize][i] = temp[i];
    //      }
    //      //!!!vip 错了又
    //      (*returnColumnSizes)[*returnSize] = numLen;
    //      (*returnSize)++;
    //      return;
    //  }

    // for (int i = 0; i < numLen; i++)
    // {
    //     if (used[i] != 1)
    //     {
    //         used[i] = 1;
    //         temp[pos] = num[i];
    //         fun(num, numLen, res, used, temp, pos + 1, returnSize, returnColumnSizes);
    //         used[i] = 0;
    //     }
    // }

    // 4刷
    if (pos == numLen)
    {
        for (int i = 0; i < numLen; i++)
        {
            res[*returnSize][i] = temp[i];
        }
        (*returnColumnSizes)[*returnSize] = numLen;
        (*returnSize)++;
        return;
    }
    else
    {
        for (int i = 0; i < numLen; i++)
        {
            if (used[i] != 1)
            {
                used[i] = 1;
                temp[pos] = num[i];
                fun(num, numLen, res, used, temp, pos + 1, returnSize, returnColumnSizes);
                used[i] = 0;
            }
        }
    }
}

int **permute(int *num, int numLen, int *returnSize, int **returnColumnSizes)
{
    // 3刷 25年9月2号左右
    //  write code here
    //  if (num == NULL || numLen == 0)
    //  {
    //      *returnSize = 0;
    //      //!!!vip解引用之后才空
    //      *returnColumnSizes = NULL;
    //      return NULL;
    //  }

    // *returnSize = 0;
    // int maxSize = 1;
    // for (int i = 1; i <= numLen; i++)
    // {
    //     maxSize *= i;
    // }
    // int **res = (int **)malloc(maxSize * sizeof(int *));
    // for (int i = 0; i < maxSize; i++)
    // {
    //     res[i] = (int *)malloc(numLen * sizeof(int));
    // }

    // (*returnColumnSizes) = (int *)malloc(maxSize * sizeof(int));

    // int *used = (int *)calloc(numLen, sizeof(int));
    // int *temp = (int *)malloc(numLen * sizeof(int));
    // int pos = 0;
    // fun(num, numLen, res, used, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值