- 博客(13)
- 收藏
- 关注
原创 只出现一次的数字II——C++
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。
2024-05-12 12:42:36
321
1
原创 C语言——环形链表
在slow和fast相遇在a点相遇后,我们让fast从a顺时针运动,每次运动一步,运动(n-1)*C距离后,fast会回到a点,那么再运动C-h的距离后,fast就来到x的位置了,因为a到x的距离(顺时针看),是C-h。左边:fast到达x时路程为L,但在进入环后,我们不清楚fast究竟走了多少距离,但可以肯定的是:从x走fast走了整数倍的圈数后,一定会回到x,此时再加上x到a的路程h,就是fast走过的路程: L+n*( C )+h(n是多少我不清楚,n一定是整数倍)x节点之后成环,抽象成一个圆。
2024-05-04 17:59:07
604
原创 C语言——相交链表
方法1:正常来说可能需要从一个链表list1中取出一个节点,将其与list2中的每一个节点进行比较。如上图所示:第一个链表要比第二个链表长,便让head1从val=2的节点运动到val=4的节点。这样两个相同长度的链表便可以很轻松的找到相交的节点。方法2:计算出两个链表的长度,让较长的链表走到与较短链表的头节点的相同位置处。此时让两个节点同时走动,如果两个节点有相同的时候,那么两个链表相交。在开始时假定headA是较长的链表,headB是较短的链表。判断两个链表相交,就要找到两个相同的节点。
2024-05-02 13:15:39
547
2
原创 C语言——迷宫问题
迷宫问题本质上本质上是对数组的一个遍历,向上下左右四个方向进行遍历。当上下左右四个方向都无法行动时,将路径进行回溯,找到另一个可以行动的方向,直到找到出口。
2024-04-27 13:41:46
2266
1
原创 C语言——合并两个有序链表
那么可以malloc一个新的节点fhead作为哨兵节点,将tail(尾节点)置为fhead,而真正的头则是fhead->next。如果list2节点较小,取list2头节点,进行尾插,list1节点不动,等待下一次比较。图中取list2节点,list向后走,list1不动,tail更新。如上图所示:当list1走完后,list2中剩余较大的数据,此时直接将list2链接到fhead的尾部即可。第一次比较list1节点的val较小,取下进行头插,list1向后走,list2不动。与数组类似,比较每一个节点。
2024-04-26 17:02:36
1563
2
原创 C语言——链表的中间节点
若左边表达式为false,那么整个表达式已经为fasle,右边表达式也不会被计算判断,所以fast必须要在逻辑与左边,避免空指针的解引用。当fast走完整个链表时,slow只走了fast的路程的一半,即为链表的中间节点位置。fast先判断,如果fast为NULL,说明节点为奇数个,fast为假,逻辑与右边便不再判断。当然还有许多要注意的问题,在循环遍历链表时,链表节点个数是奇数还是偶数对于循环的停止条件要求有所不同。slow节点走到中间位置,fast为空,此时while循环条件为while(fast)
2024-04-21 17:07:57
379
2
原创 C语言——反转链表
/新头节点//保存下一个节点定义一个为空的头节点,反转结束后返回newhead。将newhead置为NULL,如果head为NULL,那么将直接返回newhead即可。定义nextnode,在取出原链表的头节点之前保存下一个节点,以便能够找到下一个节点位置。
2024-04-21 12:12:10
530
3
原创 C语言——移除链表元素
2:当要删除的节点就是头节点时,我们就要改变原链表的头节点,让head=head->next,但此时前一个节点pre为NULL指针,没有必要对其进行改变,头节点newhead的前一个节点仍为空。如上图所示:当要删除6节点时,此时6节点正好为头节点,此时应先将newhead置为cue->next,若先free掉cur便找不到cur->next节点。如果不是头节点,pre->next要和cur->next链接起来,将cur节点free掉后,cur继续呆在pre->next节点,pre不用变化。
2024-04-19 08:46:39
694
4
原创 C语言——轮转数组
所以对k%=numSize,保证0<=k<=numSize-1,也防止数组的越界。输入:nums=[1,3,5,6,4,1,2,5] ,numsSize=8。将nums数组最后k个元素逆置,numSize-k到numSize-1。将nums数组前numSize-k个数逆置,0到numSize-k-1。将nums最后一个元素取出,tmp=nums[numSize]将数组nums向后移动一位,nums[j+1]=nums[j]输出:nums=[1,2,5,1,3,5,6,4]时间复杂度:O(n^2)
2024-04-17 17:50:41
370
4
原创 C语言——数组形式的整数加法
若num=[1,2,0,0]k=15那么Array=[5,1,2,1,],Arraypos的值则为数组长度。若num=[9,9,5]k=58在相加结束后说明仍有一位进位未处理,若carry=1,将Array[Arraypos]置1,Arrypos++即可。if(carry==1)//循环结束carry仍为1,还有一个进位未处理Arraypos++;
2024-04-16 15:50:10
1816
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人