每周刷题第三期

个人主页:星纭-CSDN博客

系列文章专栏:Python

踏上取经路,比抵达灵山更重要!一起努力一起进步! 

目录

题目一:环形链表

题目二:删除有序数组中的重复项

题目三:有效的括号

题目四:用队列实现栈

题目五:用栈实现队列 


题目一:环形链表

题目出处:. - 力扣(LeetCode)/

题目描述:这道题和上一期的环形链表很像只不过,一个是判断是否存在环,一个是求入环节点。

题解思路:采用双指针。定义两个指针fast,slow,fast一次走两步,slow一次走一步。

然后我们来分析一下这道题的数学关系。 

相遇点指的是fast指针和slow指针第一次相遇的地方。

当fast和slow相遇的时候,fast行走的距离是slow的两倍,

slow:L + X

fast:2(L + X) = L + X + a * N。a指的是fast进入环后行走的圈数

L = (a - 1) * N + N - X;

N-X就是相遇点到环的距离。也就是说,如果fast从相遇出发,slow从起点出发,均每次走一步。两者第一次相遇的地方就是进入环的节点。

struct ListNode *detectCycle(struct ListNode *head) {
	struct ListNode*fast = head,*slow = head;
	while(fast && fast->next){
		slow = slow->next;
		fast = fast->next->next;
		if(fast == slow){
			fast = head;
			while(fast != slow)
			{
				fast = fast->next;
				slow = slow->next;				
			}
            return fast;
		}
	}
	return NULL;
}

题目二:删除有序数组中的重复项

题目出处:. - 力扣(LeetCode) 

题目描述:给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

这道题的要求是,原地删除,所以空间复杂度是O(1),因为这个数组是非严格递增的,重复的元素是挨在一起的,即相等的元素在数组中一定是连续的。

解题思路:使用双指针,定义两个指针src,dst.src表示下一个不同元素的下标,dst表示要填入的位置的下标。

dst开始指向0,src开始指向1.如果src和dst相同,src就加1。不相同,dst加1,然后移动元素,然后src也加1.

int removeDuplicates(int* nums, int numsSize) {
	int src,dst;
	src = 1;
	dst = 0;
	while(src < numsSize){
		if(nums[src] != nums[dst]){
			++dst;
			nums[dst] = nums[src];
			++src;
		}
		else{
			src++;
		}
	}
	int k = dst + 1;
	return k;
}

题目三:有效的括号

题目出处:. - 力扣(LeetCode)

题目描述 :

这个题目的示例不够全面, 

对于字符串s = "{[]}",这样的字符串也成立,s = "()[{}]"也是成立的,题目所给的示例会让人误以为匹配的括号必须连续,其实不是这样的,这是题目的一个问题。

题目思路:首先需要用C语言手动实现一个栈。

然后我们开始遍历整个字符串:当遇到左括号的时候,就入栈,遇到右括号的时候,就取出栈顶元素,进行匹配,如果不匹配说明这个字符串不有效,反之继续匹配 ,直到结束,该字符串就匹配。关于栈的代码参考前面的文章。

bool isValid(char* s) {
    Stack st;
    STInit(&st);
    while (*s) {
        if (*s == '(' || *s == '[' || *s == '{') {
            STPush(&st, *s);
        } else {
            if (IsEmpty(&st)) {
                STDestory(&st);
                return false;
            } else {
                char ch = STTop(&st);
                STPop(&st);
                if ((ch == '(' && *s != ')') || (ch == '[' && *s != ']') ||
                    (ch == '{' && *s != '}')) {
                    STDestory(&st);
                    return false;
                }
            }
        }
        ++s;
    }
    bool ret = IsEmpty(&st);
    STDestory(&st);
    return ret;
}

在每次使用return语句之前都要销毁这个栈,避免内存泄漏。

最后为什么是返回ret?

如果遇到这样的字符,不难发现根本没有进入循环,直接返回了true,这明显是不正确的,所以需要进行判断,栈是否为空,如果为空,所以左括号并没匹配完成,这个字符串无效。

题目四:用队列实现栈

题目出处:. - 力扣(LeetCode)

题目描述:

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

 解题思路:

如果接下来我们要进行出栈,根据先进后出的规则,那么得到的第一个数据应该是5,可是仅仅在队列一中进行出队列入队列是达不到这样的效果的。

那么如何进行操作呢?

首先我们可以将1-4入队列到队列二中,这样队列一中就只剩下一个数据5了,此时出队列就是5.起到了先进后出的效果。如果还需要放入数据,很明显是放在队列二中,因为此时的队列一已经没有了数据了。

首先需要使用C语言实现一个队列。代码参考前面的文章。

初始化:

typedef struct {
    Queue q1;
    Queue q2;
} MyStack;

MyStack* myStackCreate() {
    MyStack* pst = (MyStack*)malloc(sizeof(MyStack));
    QueueInit(&(pst->q1));
    QueueInit(&(pst->q2));
    return pst;
}

push:


void myStackPush(MyStack* obj, int x) {
    if (!QueueEmpty(&(obj->q1))) {
        QueuePush(&(obj->q1), x);
    } else {
        QueuePush(&(obj->q2), x);
    }
}

新放入的数据,需要放在已经存放有数据的队列。如果两个队列都为空,那么此时随便放在那个队列中都可以。

删除数据:

int myStackPop(MyStack* obj) {
    Queue* noempty = &(obj->q1);
    Queue* empty = &(obj->q2);
    if (!QueueEmpty(&(obj->q2))) {
        noempty = &(obj->q2);
        empty = &(obj->q1);
    }
    while (QueueSize(noempty) > 1) {
        QueuePush(empty, QueueFront(noempty));
        QueuePop(noempty);
    }
    int top = QueueFront(noempty);
    QueuePop(noempty);
    return top;
}

由于不确定,哪一个队列是空的,所以采用假设法进行判断,出数据的时候,需要将非空队列的数据的前n-1个全部转移到空队列中,留剩下一个出栈即可。

查看栈顶元素:

int myStackTop(MyStack* obj) {
    if (!QueueEmpty(&(obj->q2))) {
        return QueueBack(&(obj->q2));
    } else {
        return QueueBack(&(obj->q1));
    }
}

实现的队列中是,含有查看队尾元素的,非空的队列的队尾元素就是栈顶元素。 

判空与销毁:

bool myStackEmpty(MyStack* obj) {
    return QueueEmpty(&(obj->q1)) && QueueEmpty(&(obj->q2));
}

void myStackFree(MyStack* obj) {
    QueueDestory(&(obj->q1));
    QueueDestory(&(obj->q2));
    free(obj);
}

这里的判空,是判断两个队列都是否为空。

题目五:用栈实现队列 

 题目出处;. - 力扣(LeetCode)

 题目描述:

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

解题思路:

这道题与上一道题类似

只不过,需要判断空了,入栈的时候只需要把 数据固定存放在一个栈中,push栈,出栈的时候,先出pop栈中的数据,如果栈为空,把push栈的数据导过来。

初始化:

typedef struct {
    ST pushst;
    ST popst;
} MyQueue;


MyQueue* myQueueCreate() {
    MyQueue*obj = (MyQueue*)malloc(sizeof(MyQueue));
    STInit(&obj->pushst);
    STInit(&obj->popst);

    return obj;
}

入数据:

void myQueuePush(MyQueue* obj, int x) {
    STPush(&obj->pushst,x);
}

查看数据:

int myQueuePeek(MyQueue* obj) {
    if(STEmpty(&obj->popst)){
        while(!STEmpty(&obj->pushst)){
        STPush(&obj->popst,STTop(&obj->pushst));
        STPop(&obj->pushst);
        }
    }
    return STTop(&obj->popst);
}

首先需要判断popst中是否为空,如果不为空就直接返回即可,为空,就需要向pust中得到数据。

 出数据:

int myQueuePop(MyQueue* obj) {
    int front = myQueuePeek(obj);
    STPop(&obj->popst);
    return front;
}

出数据,直接使用peek函数先查看一下栈顶有没有元素,有才出,否则peek元素会先导数据。

判空与销毁:

bool myQueueEmpty(MyQueue* obj) {
    return STEmpty(&obj->pushst) && STEmpty(&obj->popst);
}

void myQueueFree(MyQueue* obj) {
    STDestory(&obj->popst);
    STDestory(&obj->pushst);
    free(obj);
}

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

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

相关文章

【C语言】程序员自我修养之文件操作

【C语言】程序员自我修养之文件操作 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C语言学习之路 文章目录 【C语言】程序员自我修养之文件操作前言一.文件介绍1.1为什么使用文件1.2文件分类1.3二进制文件和文本文件 二.文件的打开和关闭2.…

docker-compose Install homer

homer前言 一个非常简单的静态主页,为您的服务器保持您的服务在手,从一个简单的yaml配置文件。 前提要求 安装 docker docker-compose 参考创建一键安装homer 脚本 homer安装位置/homerhomer 脚本位置/homer/assetshomer logo 图标/home/assets/iconshomer 端口80homer 颜色…

连续三次拒绝饭局的邀请,不会在有人请你吃饭!

人们对于饭局的态度各有不同&#xff0c;有的认为饭局纯属浪费时间&#xff0c;还有各种套路&#xff0c;应该尽量少参加。也有的人认为饭局是沟通感情的平台&#xff0c;有这样的机会应该尽量去参与。不管是否喜欢饭局&#xff0c;但总要时不时去参加的。如果你连续三次拒绝饭…

文心智能体应用示例:职场反PUA专家的诞生

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

JAVA开发 基于最长公共子序列来计算两个字符串之间的重复率

计算两个字符串之间的重复率 最长公共子序列实现代码 最长公共子序列 基于最长公共子序列&#xff08;Longest Common Subsequence, LCS&#xff09;的重复率的中心逻辑是首先找到两个或多个序列中同时出现的、不一定连续但保持相对顺序的最长子序列&#xff0c;然后计算这个最…

知识获取概述

文章目录 知识获取研究现状技术发展趋势 知识图谱主要技术包括知识获取、知识表示、知识存储、知识建模、 知识融合、知识理解、知识运维等七个方面&#xff0c;通过面向结构化、半结构化和非结构化数据构建知识图谱为不同领域的应用提供支持&#xff0c;具体的技术架构图如下图…

全栈安全 为云而生 | 亚信安全信舱ForCloud全新品牌重磅发布

5月18日&#xff0c;亚信安全云安全全新品牌ForCloud正式发布。基于“全栈安全 为云而生”的创新理念&#xff0c;亚信安全云安全完成全新、全面、全栈升级。ForCloud的发布仪式在C3安全大会“云领未来&#xff1a;全栈一体化”云安全论坛上隆重举办&#xff0c;同时亚信安全还…

许冉直播不治本,京东需要刘强东

图片&#xff5c;影视剧《纸牌屋》剧照 ©自象限原创 作者丨艾AA 编辑丨薛黎 这届618&#xff0c;消费者的热情还未显现&#xff0c;商家的怒火先爆发了。 5月21日京东618开幕次日&#xff0c;多家图书社抵制618图书大促登上了热搜。此次争议与去年双十一京东采销与电…

执行sql脚本——kettle开发03

一、转换对象的优先级 kettle中转换和作业的执行顺序&#xff1a; 1、一个作业内的转换&#xff0c;是顺序执行的。 2、一个转换内的步骤是并行执行的。 3、作业内不支持事务&#xff0c;转换内支持事务。 根据业务需要&#xff0c;通常需要在转换内顺序执行&#xff0c;小技巧…

Java进阶-SpringCloud使用BeanUtil工具类简化对象之间的属性复制和操作

在Java编程中&#xff0c;BeanUtil工具类是一种强大且便捷的工具&#xff0c;用于简化对象之间的属性复制和操作。本文将介绍BeanUtil的基本功能&#xff0c;通过详细的代码示例展示其应用&#xff0c;并与其他类似工具进行对比。本文还将探讨BeanUtil在实际开发中的优势和使用…

Go微服务开发框架DMicro的设计思路

DMicro是一个基于Go语言开发的微服务开发框架&#xff0c;旨在简化微服务架构的开发、部署和运维过程。DMicro的设计思路主要围绕以下几个方面展开&#xff1a; 简化微服务开发流程 DMicro通过提供一套简洁的API和工具&#xff0c;使得开发者可以快速搭建微服务应用。它支持服…

景源畅信电商:抖店需要的成本高吗?

在数字化时代的浪潮中&#xff0c;短视频平台迅速崛起&#xff0c;成为连接用户与商家的新桥梁。抖音作为其中的佼佼者&#xff0c;不仅改变了人们的娱乐方式&#xff0c;也催生了新型的电商模式——抖店。许多人好奇&#xff0c;入驻这样一个充满活力的平台&#xff0c;需要承…

jwtcracker下载安装出现错误

1.jwtcracker 用于爆破jwt秘钥 2.下载 ubuntu/kali安装c-jwt-cracker及使用方法-CSDN博客 参考这个大佬写的 但是我在这里出现了这个问题 显示Cannot initialize the default message digest sha256, aborting 我实在找不出来哪里有问题&#xff0c;所以直接换成docker …

C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版...Args、lambda表达式、function包装器)

C进阶&#xff1a;C11(列表初始化、右值引用与移动构造移动赋值、可变参数模版…Args、lambda表达式、function包装器) 今天接着进行语法方面知识点的讲解 文章目录 1.统一的列表初始化1.1&#xff5b;&#xff5d;初始化1.2 initializer_listpair的补充 2.声明相关关键字2.1a…

springboot+vue2+elementui实现时间段查询

1.前端代码 使用elementui的时间段选择器&#xff1a; <el-date-picker v-model"queryPage.itemTime" type"daterange"value-format"yyyy-MM-dd" class"filter-item" range-separator"至" start-placeholder"创建…

Python筑基之旅-MySQL数据库(三)

目录 一、数据库操作 1、创建 1-1、用mysql-connector-python库 1-2、用PyMySQL库 1-3、用PeeWee库 1-4、用SQLAlchemy库 2、删除 2-1、用mysql-connector-python库 2-2、用PyMySQL库 2-3、用PeeWee库 2-4、用SQLAlchemy库 二、数据表操作 1、创建 1-1、用mysql-…

Kubernetes常用命令

目录 一.资源管理办法 1.陈述式资源管理方法 &#xff08;1&#xff09;kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口 &#xff08;2&#xff09;kubectl 是官方的CLI命令行工具&#xff0c;用于与 apiserver 进行通信&#xff0c;将用户在…

python+pytest+pytest-html+allure集成测试案例

pythonpytestpytest-htmlallure集成测试案例 下面是pythonpytestpytest-htmlallure四个组件同时集成使用的简单案例。 1. 项目结构 project/│├── src/│ ├── __init__.py│ ├── main.py│├── tests/│ ├── __init__.py│ ├── conftest.py│ └──…

MySQL主从复制(二):高可用

正常情况下&#xff0c; 只要主库执行更新生成的所有binlog&#xff0c; 都可以传到备库并被正确地执行&#xff0c; 备库就能达到跟主库一致的状态&#xff0c; 这就是最终一致性。 但是&#xff0c; MySQL要提供高可用能力&#xff0c; 只有最终一致性是不够的。 双M结构的…

用Python代码批量提取PDF文件中的表格

PDF文档中常常包含大量数据&#xff0c;尤其是官方报告、学术论文、财务报表等文档&#xff0c;往往包含了结构化的表格数据。表格作为承载关键信息的载体&#xff0c;其内容的准确提取对于数据分析、研究论证乃至业务决策具有重大意义。然而&#xff0c;PDF格式虽保证了文档的…