一:数组array
1)数组理论基础(fundamentals of array theory)
数组是存放在连续内存空间上的相同类型数据的集合;
2)二分查找(binary search)
左开右闭、左开右开区间比较小众,不太建议;
数组的边界索引为0和numsSize-1;
mid怎么求的?mid写在哪个位置?
mid = (right-left)/2+left 代替 mid = (right+left)/2 可以防止mid超出int范围;
nums[mid]已经和target比较过,不要再作为闭区间的边界;
用if-else if...-else代替if-if...-if会更好;不再每个条件都判断,mid更新后此时已经满足退出循环条件,但是后续的if需要继续判断num[mid]会发生越界;
循环的终止条件思考清楚;
return老写错; 左边界变换用mid,右边界变换用--居然也能过?!
3)移除元素
双指针思想---快慢指针;
遍历数组的终值条件为index<numsSize;
4)有序数组的平方
双指针思想---左右指针;
动态数组的建立---动态内存分配malloc;
两端的平方为较大值;
新数组的赋值不要用老数组的名字;
5)长度最小的子数组*
滑动窗口思想;
for循环改成while循环最后的循环变量变化条件不能漏;
判断相等要用==!!!
6)螺旋矩阵
矩阵怎么生成?
转圈循环;
7)区间和
前缀和思想;
scanf、printf需要头文件#include <stdio.h>
malloc需要头文件#include <stdlib.h>
注意输出空格;
循环创建一个数组的同时创建它的前缀和数组需要建立新的数组;
分配的动态内存使用完成后要free;
8)开发商购买土地
需要手动输入数值的变量定义完成后不要忘记scanf,同时要用&n,&m;
可以通过scanf输入可以改变变量的值;
INT_MAX <limits.h>
遍历数组的循环变量i不要误写成n;
找到数组分割点使左右两部分和的差值最小;无序数组只能通过线性扫描;
sum和num使用不要混淆;
数组的名字要使用正确,引用正确的数组;n行m列,遍历时m和n要注意区分;
作差检查是否需要用abs;
9)补充题目
搜索插入位置:新的元素插入到当前元素前,其索引等于当前元素的索引;
在排序数组中查找元素的第一个和最后一个位置:不能用一个静态数组接收int*类型函数的返回值; 搜索到符合要求的mid及时break; 从mid向左右扩展查找的边界条件想清楚;
二:链表linked list
1)链表理论基础(fundamentals of linked list theory)
单链表、双链表、循环链表;
链表节点的定义;
2)移除链表元素(remove the linked list element)
创建的虚拟头节点需要动态分配内存;
记得写返回值;
free删除的节点;
需要->next;->data的节点一定要首先判断是否为空节点;
3)设计链表(design the linked list)
牢记链表节点结构体的创建; 节点构造函数写在外部更清晰;
新建链表节点时不需要malloc,在create_node函数中已经有;
初始化链表需要做的操作有哪些?!
初始化链表中的头节点一定要作为虚拟头节点,从而便于后续的边界处理;
free函数怎么写?!不仅要free所有节点,还需要free链表;
index<cur->data不需要括号;
4)反转链表(reverse the linked list)***
NULL表示空指针,null不可以;定义一个空节点不需要分配内存;
不仅需要temp记录后一位,还需要前一位的保存和更新;
反转四步走;
5)两两交换链表中的节点(exchange pairs)
cur=head;head指针的变化并不会影响cur;
6)删除链表的倒数第N个节点
遍历链表后使用的指针要重置;
while循环的循环变量递减表达式不能漏;
while(-1)也会执行;
7)链表相交
不要无脑cur=head;有cur_1,cur_2,head_1,head_2;
8)环形链表II
快慢指针找环;
三:哈希表hash table
1)哈希表理论基础
哈希表用于快速判断一个元素是否出现在集合里;
array、set、map;
2)有效的字母异位词
字母异位词;
3)两个数组的交集
(*returnSize)++需要加括号,解引用的优先级更低;
哈希表数组的下标才是原数组的值;
realloc动态调整内存,需要两个参数(旧指针,需要分配的内存大小);
realloc成功分配内存后,用旧的指针接收返回值,旧的内存会被释放;
calloc和malloc的区别在于会将分配的内存都初始化为0;
calloc需要两个参数,(分配的元素数量num,每个元素的大小size);
数组后方的内存过剩有影响吗,和不过剩的数组相等吗?
两个哈希数组记录元素,判断交集时都为0也是相等!!!
4)快乐数
如何取数值各个位上的单个数字;
int最大位十位数;
5)两数之和
四:字符串string
1)反转字符串
左右双指针往中间收缩;left++;right--;
2)反转字符串||
for循环的循环变量i在循环外不可用;
是否需要return?!
3)替换数字
需要定义一个静态字符数组存储输入的字符串,而不是char一个字符;
scanf会在输入的字符串末尾自动加入一个终止符;
定义字符数组时要多定义一位存储终止符'\0';
字符为单引号'';
打印字符串时不需要遍历字符数组,直接%s;
五:双指针法
六:栈与队列
七:二叉树
1)二叉树理论基础
什么是二叉树!!!
种类:满二叉树、完全二叉树、二叉搜索树、平衡二叉搜索树;
存储方式:链式存储、顺序存储;
遍历方式:深度优先搜索(前中后序遍历)、广度优先搜索(层次遍历);
二叉树定义;
1万+

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



