1、LeetCode出现的heap-buffer-overflow的问题几种可能?
1、返回数组,但是没有返回数组的数目*returnSize,或者**returnColSize
2、返回字符串,没有结束的标志位,直接返回传入参数的指针,返回自建的malloc数组的字符串
3、数组长度设置和malloc数组的长度溢出(尤其注意二维数组的分配时的长度)
4、传入参数为int **matrix,可以用matrix[x][y]来访问元素,而不是非要用
*(int *(matrix) + row + col)
*( *(matrix + row) + col)
*(a[row] + col)
char** temp = (char**)malloc(sizeof(char*)*length);
for(int i=0; i<length; i++)
{
temp[i] = (char*)malloc(sizeof(char)*length);
temp[i][i] = 0;
}
2、Leetcode中的链表是什么结构
srtuct BinTree *p = head;
head作为一个传入参数,代表的是链表的头
注意:p是有值的,且为一个节点,可以代表为0号节点
计算链表的长度时,需要将p=head 算在内部长度
3、链表生成的流程
首节点有值,尾结点无值
首节点无值,尾结点有值
首先都是创建pNode tail(记录当前的节点)
static pNode tail = NULL
(外部单个单个输入创建时,前后能够记录下当前的尾结点)
【若是没有static定义,也可以用len函数,求出当前链表的尾结点】
pNode temp = (pNode)malloc(sizeof(Node));
将temp中值存入
if(head->next == NULL)
存入head中值,或者不存入
else
将tail中存值,tail->next = temp
tail = temp;
return head
头插法生成链表
1、定义head节点,函数传入head和后续的节点值val,利用val生成temp
2、将head->next = temp(head->next == NULL)
3、temp->next = head->next
head->next = temp
4、函数返回值int *returnSize和int **returnColumnSizes的含义
问:*returnSize是什么?
答:返回数组大小数据的地址,返回二维数组则是行数的地址
*returnSize = 0 初始化
*returnSize = row;
问:returnColumnSizes是什么?
答:一个一维数组的地址的地址
returnColumnSizes 是一维数组的地址的地址
* returnColumnSizes 是一维数组的地址
(* returnColumnSizes)[i] 是一维数组的i个元素
5、如何定义int **returnColumnSizes 和 返回的二位数组
int **res = (int **)calloc(10000, sizeof(int *));
res[row] = (int*)calloc(size, sizeof(int));
res[row][col] = num;
一般情况下直接使用:
(*returnColumnSizes)[row] = col;
也可能需要在函数内部重新赋值空间大小
*returnColumnSizes = (int*)malloc(sizeof(int)*size);
6、树问题的递归
一般对于树的解决方案是:广度优先搜索(辅助结构:队列),深度优先搜索(递归,迭代的栈)
递归:
自己调用自己,在上层函数还没有结束的情况下,开启下层函数运行,首先返回的应该是调用层数
最深的函数部分,上层函数的返回值会参照下层的返回值;
最终的返回值肯定只有一个啊
【自顶向下】
树的递归题目是非常有套路可循的
因为树有两个分支,所以在递归里也有两个分支,一般是通过 递归 A(||,&&)递归 B 来实现分支