OJ第四篇

news2025/7/19 16:53:22

文章目录

  • 链表分割
  • 环形链表
  • 有效的括号

链表分割

链接: 链表分割
在这里插入图片描述

虽然这个题牛客网中只有C++,但是无所谓,我们只要知道C++是兼容C的就可以了

至于说这个题的思路,我们就弄两个链表,把小于x的结点放到一个链表中,剩下的放到另一个链表中,最后把两个链表串起来就可以了

实现方式的话有两种,一种是链表带哨兵位,一种是不带,带哨兵位的话处理起来比较简单,很多判断条件是不需要的,不带的话就相对要麻烦一些,但是你如果对链表的操作比较熟悉的话,其实还行

下面是带哨兵位的实现

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        struct ListNode *cur=pHead;
        struct ListNode *head1,*head2,*tail1,*tail2;//1的是小值,2的是大值
        //开辟哨兵位
        head1=tail1=(struct ListNode *)malloc(sizeof(struct ListNode ));
        head2=tail2=(struct ListNode *)malloc(sizeof(struct ListNode ));
while(cur){
     struct ListNode *next=cur->next;
     if(cur->val<x){
        tail1->next=cur;
        tail1=tail1->next;
        tail1->next=NULL;
     }
     else{
         tail2->next=cur;
        tail2=tail2->next;
        tail2->next=NULL;
     }
     cur=next;
}
//把两个链表接到一起,如果第一个链表为空也无所谓
tail1->next=head2->next;
 struct ListNode *head=head1->next;
 free(head1);//没用的就free掉
 free(head2);
return head;
 
    }
};

下面是不带哨兵位的实现

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
 struct ListNode *cur=pHead;
 struct ListNode *head1=NULL,*head2=NULL,*tail1=NULL,*tail2=NULL;//一般都是定义两组指针,一组管理一个链表
 while(cur){
    struct ListNode *tmp=cur;
    cur=cur->next;
    if(tmp->val<x){
if(tail1==NULL){//如果链表为空
    head1=tail1=tmp;
    tail1->next=NULL;
}
else{
    tail1->next=tmp;
    tail1=tail1->next;
    tail1->next=NULL;
}
    }
    else{
if(tail2==NULL){
    head2=tail2=tmp;
    tail2->next=NULL;
}
else{
    tail2->next=tmp;
    tail2=tail2->next;
    tail2->next=NULL;
}
    }
 }
 //合并两个链表
 if(head1==NULL){//判断第一个表是否为空
    return head2;
 }
 else{
    tail1->next=head2;
    return head1;
 }
 
    }
};

环形链表

链接:环形链表
在这里插入图片描述

这个题的话需要一些数学推理去找它们之间的关系,要不然不太好说

我们假如说起始位置到入环处的距离为a,入环出到相遇处距离为b,环的周长为c,在之前,我们已经能判断一个链表中是否有环了,就是通过两个指针,一个fast一回走两步,一个slow一回走一步,那么它们两个之间有一定的数学关系,就是2*(a+b)=a+nc+b,化简一下为c-b+c(n-1)=a,这是什么意思啊?就是一个指针从头走,一个指针从相遇处走,以相同的速度,最后就会在那个相遇入环点相遇

下面我们来实现一下

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *fast=head,*slow=head;
while(fast&&fast->next){//能出循环就没有环,有环在循环中返回
fast=fast->next->next;
slow=slow->next;
    if(fast==slow){
struct ListNode *tmp=fast;
while(tmp!=head){//相同时停止,并返回这个点
tmp=tmp->next;
head=head->next;
}
return head;
    }
}
return NULL;
}

我们之前找过两个相交链表的相交位置,这里我们如果把相遇点的前一个位置的next置为空,就可以了,需要注意前一个只能是fast的前一个

下面我们来实现一下

//找相交点的函数
//思路就是计算两个链表的长度,长的先走差的长度数,最后同时走,相同了就找到了
struct ListNode *meetpoint(struct ListNode *s1,struct ListNode *s2){
    int num1=0;
    int num2=0;
    struct ListNode *head1=s1,*head2=s2;
    while(head1){
        num1++;
        head1=head1->next;
    }
    while(head2){
        num2++;
        head2=head2->next;
    }
    struct ListNode *thelong=s1,*theshort=s2;
    if(num2>num1){
        thelong=s2;
        theshort=s1;
    }
    int num=abs(num1-num2);//求差的长度数
    while(num){
        thelong=thelong->next;
        num--;
    }
    while(thelong!=theshort){
        thelong=thelong->next;
        theshort=theshort->next;
    }
    return thelong;
}

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *fast=head,*slow=head;
while(fast&&fast->next){
    struct ListNode *fastprev=fast->next;//记录一下fast的上个位置
fast=fast->next->next;

slow=slow->next;
    if(fast==slow){
 fastprev->next=NULL;
 return meetpoint(head,slow);
    }
}
return NULL;
}

有效的括号

链接:有效的括号
在这里插入图片描述

这个题是用栈来实现的,正好利用了栈的特性,左括号入栈,右括号判断出栈,如果不匹配就返回false

bool isValid(char * s){
    ST st;
    STInit(&st);
while(*s){
    if(*s=='('||*s=='['||*s=='{'){//左括号入栈
        STPush(&st,*s);
    }
    else{
			if(STEmpty(&st)){//栈为空并且要处理的字符为右括号
				STDestroy(&st);
				return false;
			}
        char tmp=STTop(&st);//匹配栈顶元素和要处理的元素
        if(*s==')'&&tmp!='('||*s==']'&&tmp!='['||*s=='}'&&tmp!='{'){
            return false;
        }
        else{
            STPop(&st);
        }
    }
    s++;
}
if(!STEmpty(&st)){//true的话最后栈应该为空
STDestroy(&st);
    return false;
}
else{
	STDestroy(&st);
    return true;
}
}

我们在这个函数之前是需要自己创建栈的,并且要实现它的一些功能,我们之前也有代码,可以看之前的博客
链接:栈和队列

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

excel导出-将后端返回的文件流导出为excel

有的业务场景&#xff0c;需要前端自己将文本流导出为excel有的是后端返回的文本流&#xff0c;有的是调用上传组件后&#xff0c;前端组件生成的文本流&#xff0c;组件上传后点击上传的文件名&#xff0c;要求实现下载功能&#xff0c;这时的导出就需要前端自己处理了 直接上…

百度文心一言 4.0 :如何申请百度文心一言 4.0

本心、输入输出、结果 文章目录 百度文心一言 4.0 &#xff1a;如何申请百度文心一言 4.0前言如何申请千帆大模型试用百度文心一言 4.0 主要功能介绍配套发布的十余款AI原生应用插件、API 生态 百度世界大会回顾弘扬爱国精神 百度文心一言 4.0 &#xff1a;如何申请百度文心一言…

ubuntu20.04 nerf开山之作

源码 GitHub - yenchenlin/nerf-pytorch: A PyTorch implementation of NeRF (Neural Radiance Fields) that reproduces the results. 代码的相关解读 NeRF代码解读-相机参数与坐标系变换 - 知乎 原文题目&#xff1a;NeRF: Representing Scenes as Neural Radiance Field…

架构师选择题--软件架构设计

架构师选择题--软件架构设计 真题 真题 c 中间件分为5类&#xff1a; 交互是最基本的功能 b 公共服务&#xff1a;可复用的服务 b c 微服务去中心化 面向服务集中式 d 架构的组成&#xff1a; 构件 , 连接件 , 约束规则 做为部署单元拆分没有意义 a 接口是已经命名的一组操…

Xftp和Xshell的使用

目录 Xftp和Xshell的区别 Xftp安装教程、使用Xftp进行远程文件传输 一、Xftp安装教程 二、使用Xftp进行远程文件传输 三、连接至服务器 四、从 windows -> 服务器 传输文件 .Xshell安装教程、使用Xshell进行Linux远程登录 什么是xshell 一、远程登录的意义 二、…

微控制器中的晶振电路

文章目录 1234567 1 2 3 4 5 6 7

Redis命令

一、数据结构介绍。 redis是一个key-value的数据库&#xff0c;key一般是string&#xff0c;但是value有很多种类型。包括&#xff1a; 字符串&#xff08;String&#xff09;&#xff1a;字符串是 Redis 最基础的数据结构之一&#xff0c;可以存储字符串、整数或浮点数。 哈…

JDBC增删改查示例

数据库表 CREATE TABLE customers ( id int NOT NULL AUTO_INCREMENT, name varchar(15) DEFAULT NULL, email varchar(20) DEFAULT NULL, birth date DEFAULT NULL, photo mediumblob, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT39 DEFAULT CHARSETgb2312;…

Redis 面试必备 全知识点思维导图

脑图下载地址&#xff1a;https://mm.edrawsoft.cn/mobile-share/index.html?uuidcf5bf135744412-src&share_type1 事务 定义 事务是一个单独的隔离操作,事务中的所有操作都将序列化,有顺序的执行,事务执行的过程中不会被其他客服端发来的命令打断 作用 串联多个命令防…

【兔子王赠书第2期】《案例学Python(基础篇)》

文章目录 前言推荐图书本书特色本书目录本书样章本书读者对象粉丝福利丨评论免费赠书尾声 前言 随着人工智能和大数据的蓬勃发展&#xff0c;Python将会得到越来越多开发者的喜爱和应用。身边有很多朋友都开始使用Python语言进行开发。正是因为Python是一门如此受欢迎的编程语…

下载Jakarta

百度找到Jakarta的官网 https://jakarta.ee/zh/ 打开后在右上角有这两个按钮 其中starter按钮是 提供helloworld的&#xff0c;也就是【初体验】&#xff0c;可以根据版本号&#xff0c;jdk版本定制hello world&#xff1b; 另一个Download是下载【兼容产品】&#xff0c;点进…

Python合并多个相交矩形框

Python合并多个相交矩形框 前言前提条件相关介绍实验环境Python合并多个相交矩形框代码实现 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页…

小程序设计基本微信小程序的旅游社系统

项目介绍 现今市面上有关于旅游信息管理的微信小程序还是比较少的&#xff0c;所以本课题想对如今这么多的旅游景区做一个收集和分类。这样可以给身边喜欢旅游的朋友更好地推荐分享适合去旅行的地方。 前端采用HTML架构&#xff0c;遵循HTMLss JavaScript的开发方式&#xff0…

自动化测试框架指南

目录 定义测试自动化 不同类型的框架 以工具为中心的框架 面向项目的框架 关键字驱动的框架 完美测试自动化框架的主要组件 测试库 单元测试 集成和端到端测试 行为驱动开发 测试数据管理 mock&#xff0c;Stubs和虚拟化 实施模式的通用机制 测试结果报告 CI平台…

SpringBoot+自定义注解+AOP高级玩法打造通用开关

1.项目结构 2.引入依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot<…

英特尔 SGX 技术概述

目录 介绍概述指示结构Memory安全区页面缓存Enclave Page Cache &#xff08;EPC&#xff09;安全区页面缓存映射Enclave Page Cache Map (EPCM) Memory ManagementStructures页面信息Page Information (PAGEINFO)安全信息Security Information (SECINFO)分页加密元数据Paging …

ardupilot开发 --- 起飞前后 篇

起飞前检查 电机响应是否正确&#xff08;转向&#xff09;姿态响应是否正常&#xff08;roll pitch yaw&#xff09;GPS数据是否正常&#xff08;星数&#xff0c;RTK信号&#xff09;电源电压安全开关安全检测&#xff08;armed pre check&#xff09; 起飞前的必调参数 机…

SpringCloud 完整版--(Spring Cloud Netflix 体系)

目录 SpringCloudSpring Cloud Netflix 体系分布式概念&#xff1a;分析图单体应用分布式架构集群微服务分布式微服务集群 服务注册与发现Eureka作用&#xff1a;为什么使用Eureka&#xff1f;解答&#xff1a;分析图 搭建&#xff1a;1、注册中心Eureka-server搭建创建项目配置…

springboot苍穹外卖实战:三、新增员工(JWT令牌校验失败+用户名重复+ThreadLocal获取用户id解决方案)

新增员工 根据前端传递参数列表设计DTO 当前端提交的数据和实体类中对应的属性差别比较大时&#xff0c;建议使用DTO来封装数据。进入sky-pojo模块&#xff0c;在com.sky.dto包下&#xff0c;已定义EmployeeDTO。 EmployeeController /*** 新增员工* param employeeDTO* ret…

检测密码安全强度 和 凯撒加密

检测密码安全强度 按照含有数字,小写字母,大写字母,指定标点符号的种类,把安全强度分为强密码,中高,中低,弱密码. 编写程序,输入一个字符串,输出该字符串作为密码时的安全强度 from string import digits, ascii_lowercase, ascii_uppercasedef check(pwd):# 密码必须至少包含…