- 博客(28)
- 收藏
- 关注
原创 菜鸟刷题——283移动零-83删除排序链表中的重复元素
因为该题慕要求在不复制数组的情况下对数组进行原地修改,因此我们在判断一个结点值为0时,便可以立马将数组后面的数据往前挪,然后将数组末尾的数值赋值为0。由于移动数组元素时,末尾的数据一定是0,因此我们可以定义一个指针q指向数组的末尾,当移动一次数组元素,q指针指针便往前移动一步。定义两个指针p,q指向数组,如若q指针指向的数组数值为0,则将q指针的数值赋给p,两个指针同时往后移动;在这里,我们可以使用0作为这个分割中间点,只要大于0的元素我们就放在0的左边,小于或等于0的我们放在0的右边。
2023-11-17 11:21:01
100
原创 菜鸟刷题——力扣167-26-27
因为我之前接触的二分法都是对left和right的指针所指向的值进行操作,但是该方法只是利用left和right来决定mid指针所指向的值。利用mid所指向的值与数组遍历的值之间的和target相比较。p指针从数组的第一个元素开始遍历,q指针从数组的第二个元素开始遍历。当p指针与q指针相等时,我们固定住p指针,将q指针往后继续遍历;当q的值不等于p指针的值时,将q位置上的数组赋值给数组p+1位置。该方法使用两个指针,一个left指针由前往后遍历,一个right指针由后往前遍历。也就是双指针的思想。
2023-11-16 16:41:28
119
原创 菜鸟刷题——LCR140训练计划2
这个题目很简单,看到题目时,想到了两个方法。一个使用栈来存储,然后返回list[-cnt];方法二则是使用快慢指针,使得两个指针之间的距离相聚cnt步,然后当快指针指向None时,则慢指针为需要返回的训练项目编号。以下是简单逻辑的代码实现。如有疑问,请随时在评论区或私信中提出,我将尽力回答。如果有更佳的方法来解决这个问题,非常欢迎大家分享!
2023-11-14 20:29:49
90
原创 菜鸟刷题——160相交链表
如果两个链表存在共同的结点,则两个结点会在相交结点相遇(因为两个结点走的路程都是一样长的),如果两个结点同时为none,则证明两个链表没有共同结点。哈希集合的方法:利用集合存储其中一个链表中的元素,存储的是结点的地址,地址不会重复,所以可以使用集合来存储。注意,这里使用的是集合不是列表。由于传进来的数据是一个列表,不能使用len()函数直接得到链表的长度,所以我在这里自己写了一个Len()函数来得到列表的长度。暴力求解法的解题过程:遍历A中的每个结点,然后再与B中的每个结点对比,看地址是否相同。
2023-11-13 21:59:52
72
原创 菜鸟刷题——876链表的中间结点,142环形链表2
定义三个指针p,fast,slow指向head,让fast,slow指针分别以步距为2,1往前移动。如若fast与slow相遇,则证明链表有环,且fast指针比slow指针多走的n步为环大小的k倍。假设fast与slow相遇的结点位置与环起点的位置相隔距离x,则slow指针还剩n-x到达环的起点,p指针离环的起点也相隔n-x步。则使得p指针与slow指针同时以步距为1的距离往后移动,当p == slow时,证明p现在所处位置为环的起始结点。这个问题比较简单,使用快慢指针确定中间结点的位置,然后将其返回。
2023-11-09 11:19:49
27
原创 菜鸟刷题——19删除链表的倒数第N个结点
定义两个指针current,last.使得last指针先走n-1步,然后再current和last一起走,这样当last.next==None时,current指针指向的下一个结点就是需要删除的结点。当寻找到最后一个结点时开始反向计数,如果结点个数等于n,则返回当前结点的后续所有结点用于链接新的链表,如果不等于n,则返回所有结点。这个题目属于链表的常规方法,最常能想到的就是快慢指针法,由于本人对于递归的方法运用不熟练,因此下面介绍两种方法来解决这个问题。可以看出,使用递归的方法代码更加简洁。
2023-11-08 10:54:20
31
原创 菜鸟刷题——23合并K个升序链表
堆是用数组表示的二叉树,分为大根堆和小根堆,大根堆堆顶为最大的结点,小根堆是对堆顶为最小结点。堆的作用是能迅速的找到数组中的最大结点或者最小节点。但是要注意的是,python中的heappush自动建立的是小根堆,没有针对大根堆写的方法。因此,在需要构建大根堆的时候,我们通常会将节点的值取负号,转换为求最小节点的问题,即可以构建小根堆来解决大根堆的构建问题。helper = [] # 创建一个优先级队列。
2023-11-07 17:02:07
117
原创 菜鸟刷题——21合并两个有序链表
递归的代码就十分简洁了,就是判断当前两个链表的结点那个最小,然后小的那个结点的next结点则再一次调用自身方法来判断。迭代方法我用了两种方式来实现,一个是边判断结点值的大小边创建新链表,一个是完全判断完成再创建新链表(主要是想复习一下昨天学到的队列的用法)这个方法利用队列的先进先出先将两个链表的结点按照value值的大小存储起来,然后创建一个亚结点依次链接起来。注意,使用迭代的两种方法我都用到了哑结点,下面使用到的递归的方法则可以在不用创建哑结点的情况下实现两个有序链表的合并。
2023-11-02 10:33:56
56
原创 菜鸟刷题——86分隔链表
首先构建两个哑指针,daummy是用来存放小于x的值的链表,daummy2是用来存放大于等于x的值的链表。请注意,这里从目的链表读取数据的时候,我是重新创建了一个结点,创建时是默认结点的next=None,因此避免了成环的可能性。在实现这个方法中,我发现在插入比x大的值的时候,我无法明确的插入指定的位置。所以查看题解,看到一位作者——ThisIsT用队列的先进先出的特性来解决这个问题。这个方法加强了我对于队列的应用理解,之前我对于队列的应用只限于存储数值数据对象,没有想过还可以存储结点数据对象,很新奇!
2023-11-01 14:37:39
583
1
原创 菜鸟刷题——142训练计划
递归的方法则是一直找最小的结点,找到之后就作为next结点,感觉有点像树中找最小的值的方法。可是当p1/p2为None时,则p1/p2则不存在val这个属性,出现了下面的错误。之前对于递归和迭代的概念弄混淆了,递归:调用函数本身来解决;迭代:使用循环来解决。这里我构造新链表的时候,刚开始使用的判断条件是。该题目有两种方法,迭代和递归。
2023-10-31 22:48:09
50
1
原创 菜鸟刷题——LeetCode141环形链表
对于如何判断链表有环,有下列两种方法。首先我们进行结点的初始化上述中val为该节点本身的值,next表示指向的下一个结点的值,初始化定义为NoneLinkList类中首先初始化一个头节点head,然后使用尾插法,依次调用ListNode创建结点然后链接起来。p为最后一个结点,q为链表的头节点。接下来,判断创建的链表是否有环。下面将介绍两种方法。
2023-10-30 15:11:14
46
1
原创 c语言实现数据结构顺序表基本操作
一、顺序表的实现(1)顺序表静态分配#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <Windows.h>#define MaxSize 10//顺序表的实现——静态分配typedef struct{//typedef的作用是起别名 int data[MaxSize]; int length;}SqList;//基本操作——初始化一个顺序表void InitList(SqList *L)
2021-04-03 23:52:36
459
原创 用C语言实现通讯录(初阶)
包括三个文件。test.c——用于测试功能Contact.c——用于写各种功能函数实现代码Contact.h——用于声明函数或者结构的代码如下:1、Contact.h#define _CRT_SECURE_NO_WARNINGS 1#define MAX 1000#define MAX_NAME 20#define MAX_SEX 5#define MAX_TEL 12#define MAX_ADDR 30#include <stdio.h>#include <
2021-03-31 09:24:44
224
原创 结构体实现位段
结构体实现位段**(1)什么是位段?位段的声明和结构是类似的,有两个不同:位段的成员必须是int 、unsigned int 或signed int位段的成员名后边有一个冒号和一个数字例如:struct s{ int _a:1; int _b:5; };s就是一个位段类型。(2)位段的内存分配位段的成员可以是int 、unsigned int 、signed int或者是char(属于整形家族)类型位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式开辟
2021-03-30 23:59:39
191
原创 枚举
枚举**枚举顾名思义就是一一列举。把可能的取值一一列举。1、枚举类型的定义enum Sex{ MALE, FEMALE, SECRET};上面的enum Sex是枚举类型,{}中的内容是枚举类型的可能取值。也叫枚举常量。这些可能取值都是有值的,默认从零开开始,依次递增1,当然在定义的时候也可以赋初值。enum Sex{ MALE = 1, FEMALE = 7, SECRET }; 2、枚举的优点我们可以用#define来定义常量,那为什么要用枚举呢?枚举的优点增加
2021-03-30 23:58:19
151
原创 联合(共用体)
联合(共用体)**1、联合类型的定义联合也是一种特殊的自定义类型,这种类型定义的变量也包括一系列的成员,特别是这些成员共用同一块空间(所以联合也叫共用体)例如://联合体声明union U{ char c; int i; };//联合变量的定义union U u;上面代码中的u联合体变量的大小为4。2、联合的特点联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存那个最大的成员)面试题:判断当前计算机的大小端存储#defin
2021-03-30 23:57:25
264
原创 内存函数的使用与剖析
一、memcpy函数void* memcpy(char dest,const char src,size_t num);规定:函数memcpy 从source的位置开始向后复制num个字节的数据到dest的位置。这个函数在遇到’\0’的时候并不会停下来如果source和dest有任何重叠,复制的内容都是未定义的。c语言规定,memcpy函数处理的是内存不重叠的复制,内存重叠的复制由memmove函数来完成。1、memcpy函数实现#define _CRT_SECURE_NO_WARNIN
2021-03-30 00:39:17
96
原创 字符串函数使用与剖析——长度受限的字符串函数
长度受限的字符串函数一、strncpy函数char* strncpy(char *dest,const char *src,size_t num);功能:拷贝num个字符从源字符串到目标空间规定:如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后面追加0,直到num个。1、strncpy函数模拟实现#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <Windows.h>#incl
2021-03-29 17:01:20
373
原创 字符串函数的使用和剖析——长度不受限的字符串函数
模拟实现函数函数介绍:1、strlensize_t strlen(const char* str);字符串是以‘\0’结尾的。strlen返回的是‘\0’前出现的字符的个数,不包括‘\0’的长度。参数指向的字符要以‘\0’结尾注意函数的返回值是size_t,是无符号的**(易错)**strlen模拟实现int my_strlen(const char *p){ assert(*p); int count=0; while (*p){//遇到'\0'结束 count++;
2021-03-28 16:23:32
291
1
原创 C语言指针进阶学习
指针类型:1、字符指针char* a能够指向字符数据的指针2、整型指针int *a能够指向整型数据的指针3、浮点型指针float *a能够指向浮点型数据的指针4、数组指针int a[7] = {1,2,3,4,5,6,7};int (*p)[7] = &a;能够指向数组的指针5、函数指针注:!!!1、sizeof(数组名) ------>数组名表示整个数组2、&数组名 ----------> 数组名表示整个数组3、其余情况下数组名
2021-03-25 10:17:39
262
原创 指针作业
#define _CRT_SECURE_NO_WARNINGS 1#include <Windows.h>#include <stdio.h>test(){ char arr[] = "abcdefg"; printf("逆序前的数组\n"); printf("%s", arr); printf("\n"); int sz = strlen(arr); int i = 0; for (i = 0; i < sz / 2; i++){ char tmp .
2021-03-21 13:27:30
217
2
原创 数据存储以及初阶指针应用
任意类型冒泡排序练习//任意类型冒泡排序#include <stdio.h>#include <Windows.h>struct stu{ char name[5]; int age;};//结构体中的年龄int cmp_age(const void* e1, const void *e2){ return ((struct stu*)e1)->age - ((struct stu*)e2)->age;}//结构体中的年龄int cmp_n..
2021-03-20 14:50:01
102
原创 小谭的力扣刷题 2021-3-18
leetCode 算法58题(简单)问题描述:最后一个单词的长度给你一个字符串 s,由若干单词组成,单词之间用空格隔开。返回字符串中最后一个单词的长度。如果不存在最后一个单词,请返回 0 。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。int lengthOfLastWord(char * s){ int sz = strlen(s); if(sz>=1&&sz<=10000){ int flag = 0;//用来标记单词后面有无空格
2021-03-18 23:05:07
95
原创 2021-03-17作业完成情况
void Init(int arr[NUM], int num){ int i = 0; for (i = 0; i < num; i++){ arr[i] = 0; }}void print(int arr[NUM], int num){ int i = 0; for (i = 0; i < NUM; i++){ printf(" %d", arr[i]); } printf("\n");}void reverse(int arr[NUM], int num){.
2021-03-17 18:29:57
81
原创 冒泡排序
昨天晚上听课的时候老师提到了冒泡排序,本来以为自己已经掌握了。结果私下学习的时候发现自己虽然知道冒泡排序的过程,但是对呀编码一塌糊涂,所以来总结一下。这是冒泡排序的普通写法:void Bubble(int arr[NUM], int num){ int i = 0; int j = 0; int tmp = 0; for (i = 0; i < num; i++){//排序的趟数 for (j = 0; j < num - 1 - i; j++){//每趟排序的个数 if
2021-03-17 09:10:30
72
原创 c语言扫雷游戏
本游戏由三个文件构成分别是game.h(头文件)game.c和test.cgame.h内容为:#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <stdlib.h>#include <time.h>#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2#define T_COUNT 10 //雷的个数voi
2021-03-15 22:06:55
77
原创 C语言学习——递归
递归:调用本身的编程就叫递归递归的两个必要条件:1、递归一定要存在能够结束递归的条件2、每次递归都要越来越接近递归结束的条件。注:递归的次数太多了也不行,可能会出现栈溢出的问题。递归习题练习:1、汉诺塔问题第一步:分析问题,确定问题思路。汉诺塔代码:void move(char x,char z){printf("%c->%c移动了一个盘子\n",x,z);}void hanoi(int num,char x,char y,char z){if(num==1)print
2021-03-15 17:55:05
453
原创 2021.3.12 c语言学习——分支和循环的练习
2021.3.12 c语言学习——分支和循环的练习今日练习练习效果:练习一:代码:int main(){int num = 0;int fac = 1;int sum = 1;printf(“请输入你要求得阶乘数\n”);scanf("%d", &num);for(fac=1;fac<=num;fac++){sum = sum*fac;}printf("%d的阶乘数值为%d",num,sum);}显示结果:练习2:练习3:int binsearch(
2021-03-14 17:22:00
400
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人