继续更新拷打面试官系列: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,

最低0.47元/天 解锁文章
907

被折叠的 条评论
为什么被折叠?



