C语言leetcode刷题笔记3

C语言leetcode刷题笔记3

  • 第8题:876.链表的中间结点
    • 遍历数节点个数
    • 快慢指针
  • 第9题:874.比较含退格的字符串
  • 第10题:155.最小栈
    • 法1:getMin内部实现查找
    • 法2:getmin直接返回值
    • 补充:栈的使用
      • 例子
      • 优化:传递指针
      • 优化:初始化、动态分配、释放

第8题:876.链表的中间结点

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 。

遍历数节点个数

struct ListNode* middleNode(struct ListNode* head) {
    int count=0;
    struct ListNode*t=head;
    while(t)
    {
        t=t->next;
        count++;
        
    }
   // count++;
    count=count/2;
    t=head;
    while(count){
        
        t=t->next;
        count--;
    }
    return t;
    
}

快慢指针

struct ListNode* middleNode(struct ListNode* head) {
    struct ListNode* show=head;
    struct ListNode* fast=head;
    while(fast->next!=NULL)
    {
        
        fast=fast->next->next;
        show=show->next;
        if(fast==NULL)break;
    }
    return show;
}

第9题:874.比较含退格的字符串

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。

注意:如果对空文本输入退格字符,文本继续为空。

示例 1:

输入:s = “ab#c”, t = “ad#c”
输出:true
解释:s 和 t 都会变成 “ac”。

void simplify(char* s) {
    int sl = strlen(s);
    int p = 0;
    for (int i = 0; i < sl; i++) {
        if (s[i] == '#') {
            if (p > 0)
                p--;

        }
        else
            s[p++] = s[i];
    }
    s[p] = '\0';
    return;
}
bool backspaceCompare(char* s, char* t) {
simplify(s);
simplify(t);
   
    return strcmp(s, t) == 0;
}

第10题:155.最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。

示例 1:

输入:
[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.

法1:getMin内部实现查找



typedef struct {
    int value[10001];
    int stacktop;

} MinStack;


MinStack* minStackCreate() {
    MinStack* obj = malloc(sizeof(MinStack));
    obj->stacktop = 0;

    return obj;
}

void minStackPush(MinStack* obj, int val) {
    obj->value[obj->stacktop] = val;
    (obj->stacktop)++;
}

void minStackPop(MinStack* obj) {
    if (obj->stacktop)
    {
        //obj[stacktop-1].value =INT_MAX;
         (obj->stacktop)--;

    }
       
}

int minStackTop(MinStack* obj) {
    if (obj->stacktop)
        return obj->value[(obj->stacktop)-1];
    else
        return 0;
}

int minStackGetMin(MinStack* obj) {
    if (obj->stacktop) 
    {
        if(obj->stacktop==1)return obj->value[0];
        int Mi = obj->value[0];
        
        for (int i = 1; i < obj->stacktop; i++) 
        {
        if (obj->value[i] < Mi)
            Mi = obj->value[i];
        }
        return Mi;
    }
    else
        return 0;
}

void minStackFree(MinStack* obj) { free(obj); }

/**
 * Your MinStack struct will be instantiated and called as such:
 * MinStack* obj = minStackCreate();
 * minStackPush(obj, val);

 * minStackPop(obj);

 * int param_3 = minStackTop(obj);

 * int param_4 = minStackGetMin(obj);

 * minStackFree(obj);
*/

在这里插入图片描述

法2:getmin直接返回值

typedef struct {
     int *data;//data[100]
    int *mins;
    int size;
    
} MinStack;


MinStack* minStackCreate() {
    MinStack* obj=(MinStack*)malloc(sizeof(MinStack));
    obj->data=NULL;
    obj->mins=NULL;
    obj->size=0;
    return obj;
    
}

void minStackPush(MinStack* obj, int val) {
    obj->data=(int*)realloc(obj->data,sizeof(int)*(obj->size+1));
    obj->mins=(int*)realloc(obj->mins,sizeof(int)*(obj->size+1));//
    obj->data[obj->size]=val;
    if(obj->size==0||obj->mins[obj->size-1]>val)
    {
        obj->mins[obj->size]=val;
    }
    else
    {
        obj->mins[obj->size]=obj->mins[obj->size-1];
        

    }
    obj->size++;
    
}

void minStackPop(MinStack* obj) {
    obj->size--;
    
}

int minStackTop(MinStack* obj) {
    return obj->data[obj->size-1];
    
}

int minStackGetMin(MinStack* obj) {
    return obj->mins[obj->size-1];
   // return 0;
    
}

void minStackFree(MinStack* obj) {
    free(obj->data);
    free(obj->mins);
    obj->size=0;
    free(obj);
    
}

在这里插入图片描述

补充:栈的使用

例子


#include <string.h>

#include <stdio.h>

typedef struct{
    int data[100];
    int size;

}Stack1;
void Push(Stack1 t,int val)//只能修改传递过来的值
{
    t.data[t.size]=val;
    t.size++;
}
void Pop(Stack1 t)
{
    t.size--;
}
void StackPrint(Stack1 t)
{
    int len=t.size;
    int i;
    for(i=0;i<len;i++)
    {
        printf("t.data[%d]=%d\n",i,t.data[i]);
    }
}
int main()
{
    Stack1 t;
    t.size=0;
    memset(t.data,100,0);


    Push(t,10);//无法修改
    Push(t,20);
    StackPrint(t);


    return 0;
}
//输出空
//未使用指针,无法修改值

优化:传递指针

#include <string.h>

#include <stdio.h>

typedef struct{
    int data[100];
    int size;

}Stack1;
void Push(Stack1* t,int val)
{
    t->data[t->size]=val;
    t->size++;
}
void Pop(Stack1* t)
{
    t->size--;
}
void StackPrint(Stack1 t)
{
    int len=t.size;
    int i;
    for(i=0;i<len;i++)
    {
        printf("t.data[%d]=%d\n",i,t.data[i]);
    }
}
int main()
{
    Stack1 t;
    t.size=0;
    memset(t.data,100,0);


    Push(&t,10);
    Push(&t,20);
    Push(&t,30);
    Pop(&t);
    StackPrint(t);


    return 0;
}
/*
t.data[0]=10
t.data[1]=20

*/

优化:初始化、动态分配、释放

#include <string.h>

#include <stdio.h>
#include <malloc.h>

typedef struct{
    int *data;//data[100]
    int size;

}Stack1;
Stack1* create()
{
    Stack1* obj=(Stack1*)malloc(sizeof(Stack1));
    obj->data=NULL;
    obj->size=0;
    return obj;


}
void Push(Stack1* t,int val)
{
    t->data=(int*)realloc(t->data,sizeof(int)*(t->size+1));
    t->data[t->size]=val;
    t->size++;
}
void Pop(Stack1* t)
{
    t->size--;
}
void freestack1(Stack1* t)
{
    free(t->data);
    t->size=0;
    free(t);
    //t=NULL;

    //t->size--;
}
void StackPrint(Stack1 t)
{
    int len=t.size;
    int i;
    for(i=0;i<len;i++)
    {
        printf("t.data[%d]=%d\n",i,t.data[i]);
    }
}
int main()
{
//    Stack1 t;
//    t.size=0;
//    memset(t.data,100,0);
    Stack1 * t=create();


    Push(t,10);//
    Push(t,20);
    Push(t,30);
    Pop(t);
    StackPrint(*t);
	freestack1(t);

    return 0;
}
/*
t.data[0]=10
t.data[1]=20

*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/620205.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用自动矢量化编译Neon

概述 作为程序员&#xff0c;你有多种方式使用 Neon 技术&#xff1a; 支持 Neon 的开源库&#xff0c;例如 Arm Compute Library提供一种最简单的方式使用 Neon编译器的自动矢量优化特性可以利用 Neon 技术自动优化你的代码Neon intrinsics内建函数&#xff0c;编译器用相应…

ArcGIS如何计算地级市间的距离

一、数据准备 加载配套实验数据包中的地级市和行政区划矢量数据(订阅专栏后,从私信查收数据),如下图所示: 二、计算距离 1. 计算邻近表 ArcGIS提供了计算点和另外点之间距离的工具:分析工具→邻域分析→生成临近表。 计算一个或多个要素类或图层中的要素间距离和其他邻…

sCrypt受邀在中国人民大学举办《区块链与数字经济》课程讲座

4月17日&#xff0c;可一科技特邀美国sCrypt公司的开发工程师周全&#xff0c;在中国人民大学的《区块链与数字经济》课程上进行了讲座。周全讲解了区块链的分布式设计、不可篡改特性&#xff0c;以及智能合约的基本原理&#xff0c;利用“智能家居触发机制”等生动比喻&#x…

JS解密之新js加密实战(二)

前言 上次发了一篇关于新加密的&#xff0c;只解了前边两层&#xff0c;这中间家里各种事情因素影响&#xff0c;没有继续进一步研究&#xff0c;今天百忙之中抽空发布第二篇&#xff0c;关于其中的一小段加密片段&#xff0c;我认为分割成多个小片段是更容易被理解的。逻辑相…

ansible——playbook

一、playbook定义 Ansible Playbook是设定自动化任务的一种蓝图&#xff0c;可在无需人工干预或有限干预的前提下执行复杂的IT操作。Ansible Playbook对一组或一类共同构成 Ansible 清单的主机执行。 Ansible Playbook本质上是一些框架&#xff0c;是一些预先编写的代码&#x…

OrangePi Zero2 全志H616开发学习文档、基础IO蜂鸣器、超声波测距、舵机PWM基础开发

一.平台介绍 OrangePi开发板不仅仅是一款消费品&#xff0c;同时也是给任何想用技术来进行创作创新的人设计的。它是一款简单、有趣、实用的工具&#xff0c;你可以用它去打造你身边的世界。 特性 CPU 全志H616四核64位1.5GHz高性能Cortex-A53处理器GPU MaliG31MP2 Supports…

【树】简要理解树的概念

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1、树的概念2、树的相关概念3、结语 1、树的概念 树是一种非线性的数据结构&#xff0c;它…

[FSCTF 2023]ez_php1

一共有三小关 第一关&#xff1a;md5加密 第二关&#xff1a;反序列化 重点 单个字符串序列化 unserialize($str) "$KEY" <?php $KEY"YES I love";echo serialize($KEY); s:10:"YES I love"; 第三关&#xff1a; 反序列化 把a的地址赋给…

【SpringBoot】 什么是springboot(二)?springboot操作mybatisPlus、swagger、thymeleaf模板

文章目录 SpringBoot第三章1、整合mybatsPlus1-234-67-10问题 2、整合pageHelper分页3、MP代码生成器1、编写yml文件2、导入依赖3、创建mp代码生成器4、生成代码5、编写配置类扫描mapper类6、编写控制器类 4、swagger1、什么是swagger2、作用3、发展历程4、一个简单的swagger项…

Hexo博客重新部署与Git配置

由于电脑重装了一次&#xff0c;发现之前Hexo与NexT主题版本过于落后&#xff0c;重新部署了下。 1 Node.js与git安装 这一块安装就不赘述了。去两个官网找安装文件安装即可。 node.js git 打开git以后配置的几个关键命令行。 git config --global user.name "你的gi…

ArcGIS水文水环境数据编辑、管理、处理与分析;ArcGIS水文分析及流域特征提取;湖泊水库水环境监测及评价;河道水污染预测与水环境容量计算等案例实践

目录 专题一 ArcGIS&#xff1a;数据管理 专题二 ArcGIS&#xff1a;数据转换 专题三 ArcGIS&#xff1a;地图制作 专题四 水文水环境数据编辑与管理 专题五 水文水环境数据处理与分析 专题六 ArcGIS水文分析及流域特征提取 专题七 湖泊水库水环境监测及评价 专题八 河…

java学习之zip炸弹攻击

一、概述 Zip炸弹是一种特殊类型的Zip文件&#xff0c;它包含了大量的无用数据。Zip文件格式允许使用压缩算法来减小文件的大小&#xff0c;但是如果Zip文件中的某些内容被重复压缩&#xff0c;就会导致文件大小急剧增加。Zip炸弹利用这个特性&#xff0c;将一些无用的数据多次…

配置接口的主从IP地址

组网需求 如图1所示&#xff0c;Router上只有一个空闲接口GE1/0/0&#xff0c;但该局域网中的计算机分别属于2个不同的网段10.16.1.0/24和10.16.2.0/24&#xff0c;要求通过Router可以实现一个接口接入两个不同的网段。 图1 配置IP地址示例 配置思路 配置主从IP地址的思路…

【C++】STL-list的使用

目录 1、list的使用 1.1 list的构造 1.2 list的遍历 1.3 list capacity 1.4 list element access 1.5 容量相关 list是一个带头双向循环链表 1、list的使用 1.1 list的构造 1.2 list的遍历 list只有两种遍历方式&#xff0c;因为没有operator[] 因为list的双向链表&am…

Docker复习

文章目录 基础Docker基础命令镜像操作命令容器操作命令 案例:安装MySql案例:查看DockerHub&#xff0c;拉取Nginx镜像&#xff0c;并运行容器 基础 Docker基础命令 启动Docker systemctl start docker镜像操作命令 从远程仓具下载镜像到本地 docker pull 镜像名称 无版本号…

高并发系统设计-系统的“三高“目标

目录 一、高并发 1.高并发相关指标 2.如何提高并发能力 二、高并发的目标 1.高性能 2.高可用 3.高扩展 一、高并发 高并发&#xff08;High Concurrency&#xff09;是互联网分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计保证系统能…

parallelsdesktop19密钥激活 PD19虚拟机完整图文安装教程

Parallels Desktop 19 &#xff08;简称 PD 19)是最新发布的 macOS 平台的 windows 虚拟机&#xff0c;本文是使用 Parallels Desktop 19 虚拟机安装 Windows 的详细图文破解安装教程。 一下载安装 Parallels Desktop 软件下载完成后打开&#xff0c;双击打开 安装.dmg Para…

1070: 邻接矩阵存储简单路径

解法&#xff1a; #include<iostream> #include<vector> using namespace std; int arr[100][100]; int n; int sta, des; vector<int> path; vector<vector<int>> res; void dfs(vector<int> &a,int i) {a[i] 1;path.push_back(i);…

【漏洞复现】osCommerce install.php存在远程代码执行漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

第5章 处理GET请求参数

1 什么是GET请求参数 表单GET请求参数是指在HTML表单中通过GET方法提交表单数据时所附带的参数信息。在HTML表单中&#xff0c;可以通过表单元素的name属性来指定表单字段的名称&#xff0c;通过表单元素的value属性来指定表单字段的值。当用户提交表单时&#xff0c;浏览器会将…