Insight on the Code<代码随想录>

一:数组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)二叉树理论基础

        什么是二叉树!!!

        种类:满二叉树、完全二叉树、二叉搜索树、平衡二叉搜索树;

        存储方式:链式存储、顺序存储;

        遍历方式:深度优先搜索(前中后序遍历)、广度优先搜索(层次遍历);

        二叉树定义;

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值