【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加

news/2024/5/5 17:59:51/文章来源:https://blog.csdn.net/qq_64743563/article/details/133998074

在这里插入图片描述

🐌个人主页: 🐌 叶落闲庭
💨我的专栏:💨
c语言
数据结构
javaEE
操作系统
Redis

石可破也,而不可夺坚;丹可磨也,而不可夺赤。


刷题篇

  • 一、只出现一次的数字
    • 1.1 题目描述
    • 1.2 思路分析
    • 1.3 代码演示
  • 二、多数元素
    • 2.1 题目描述
    • 2.2 思路分析
    • 2.3 代码演示
  • 三、环形链表 II
    • 3.1 题目描述
    • 3.2 思路分析
    • 3.3 代码演示
  • 四、两数相加
    • 4.1 题目描述
    • 4.2 思路分析
    • 4.3 代码演示

一、只出现一次的数字

1.1 题目描述

给你一个非空整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。


在这里插入图片描述


1.2 思路分析

这道题可以通过使用Map集合将数组中的数字作为键存储,这个数字出现的次数作为值存储,将整个数组遍历按这个键值对的方式存储,最后再遍历这个集合判断哪个数字对应的值为1就表示这个数字只出现了一次:

  • 创建Map集合,遍历数组,根据当前数字作为键的参数拿到集合中的值count,再判断这个count值是否为空,若为空,则默认这个值为1,将其和当前数字添加到Map集合中,若不为空,则这个值自增1,表示第二次出现这个数字,再将其和当前数字添加到Map集合中,覆盖之前的键值对,当遍历完这个数组后,再对Map集合进行遍历,根据数字作为键的参数得到它所出现的次数,判断这个此时是否等于1,若等于1,即表示当前数字只出现了一次,返回这个数字即可。
    巧用技巧,这道题还有一个比较简单的方式,由于数组中肯定有一个数字只出现了一次,其它数字都是成对出现的,所以可以将整个数组的数字进行按位异或,两个相同的数字异或为0,0异或任何数仍未任何数:
  • 定义一个变量拿到数组的第一个元素,然后从他的下一个索引处开始遍历数组,遍历得到的数组的每一个元素都和这个值进行异或,结果再赋给这个值,遍历结束后返回这个值即可。

1.3 代码演示

  • Map集合:
public int singleNumber(int[] nums) {Map<Integer,Integer> map = new HashMap<>();//map集合中的键是查的数字,值是数字出现的次数for(Integer num : nums) {Integer count = map.get(num);count = count == null ? 1 : ++count;map.put(num,count);}for (Integer num : map.keySet()) {int count = map.get(num);if (count == 1) {return num;}}return -1;}
  • 异或:
public int singleNumber(int[] nums) {int result = nums[0];if (nums.length > 1) {for (int i = 1; i < nums.length; i++) {result = result ^ nums[i];}}return result;}

二、多数元素

2.1 题目描述

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。


在这里插入图片描述


2.2 思路分析

与上一道题类似,也是通过使用Map集合将数组中的数字作为键存储,这个数字出现的次数作为值存储,将整个数组遍历按这个键值对的方式存储,最后再遍历这个集合判断哪个数字对应的值大于数组长度的½:

  • 创建一个Map集合,遍历数组得到数组的每一个数字,根据这个数字作为map集合获取值的参数得到一个整型值赋给一个整型变量,判断这个变量的值是否存在,若不存在,则将该值默认赋值为1表示该数字出现一次,否则该数字自增1,表示该数字多次出现,遍历完数字后,就收集到了每个数字出现的次数,遍历Map集合,得到每个数字的值判断其是否大于数组长度的½,若存在这个数字,直接返回该数字即可。

2.3 代码演示

   public int majorityElement(int[] nums) {//利用map排序Map<Integer,Integer> map = new HashMap<>();for (Integer num : nums) {Integer count = map.get(num);count  = count == null ? 1 : ++count;map.put(num,count);}for (Integer num : map.keySet()) {int count = map.get(num);if (count > (nums.length/2)) {return num;}}return -1;}

三、环形链表 II

3.1 题目描述

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改链表。


在这里插入图片描述


在这里插入图片描述


3.2 思路分析

这个算是环形链表判断的进阶版,是要返回环的入口节点所对应的索引值,我的思路还是利用快慢指针,先将入环节点找到,再定义一个新的节点指向链表的头,新节点从链表头开始与入环处节点同时遍历,当两个节点相遇时,新节点就可以作为入环节点的索引返回:

  • 当链表为空或者链表的第二个节点为空时,返回空,表示没有环
  • 链表不为空时,定义两个指针均指向链表头,当快指针不为空时,进入循环,此时,慢指针指向它的下一个节点,当快指针的下一个节点不为空时,快指针指向它的下一个节点的下一个节点(比慢指针多走一步),当快指针的下一个节点为空时,直接返回空(表示没有环),当快指针和慢指针相遇时,此时的快(或慢)指针即为入环节点,定义一个节点指向链表头结点,当新节点与此时的慢指针不相等时,开始循环,每次各走一步,当两个节点相遇时,新指针就是入环节点的索引,返回即可。

3.3 代码演示

public ListNode detectCycle(ListNode head) {if (head == null || head.next == null) {return null;}//定义快慢指针ListNode fast = head;ListNode slow = head;while(fast != null) {slow = slow.next;if(fast.next != null) {fast = fast.next.next;} else {return null;}if (fast == slow) {ListNode ptr = head;while(ptr != slow) {ptr = ptr.next;slow = slow.next;}return ptr;}}return null;}

四、两数相加

4.1 题目描述

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。


在这里插入图片描述


在这里插入图片描述


4.2 思路分析

直接分析代码的逻辑,这道题的实现是将两个链表中节点的值相加,最后得到一个新的链表,新链表对应的值是两个旧链表值的和:

  • 定义两个节点指针分别表示新链表的头和尾,初始时均为空,定义一个整型变量作为进位节点的值,当有链表不为空时,进入循环,定义整型变量记录非空节点的值,将两个链表的值与进位值相加得到一个总数,当新链表的头为空时,将新链表的头和尾军指向一个值为总数模10得到的余数的节点,然后更新进位值为总数除以10得到的商(向下取整),当两个链表不为空时继续遍历两个链表,进入第二次循环,记录非空链表的节点值,记录总数(两个节点值+进位值),第二次循环新链表的头不为空,则将新链表的尾的下一个节点指向一个值为总数模10得到的余数的节点,再将尾指向尾的下一个节点,更新进位值为总数除以10得到的商(向下取整),继续遍历链表,当两个链表都遍历完时,还需要判断进位值是否大于0,若大于0,则将新链表的尾的下一个节点指向值为进位值的新节点,再将为指向尾的下一个节点,最后返回新链表的头。

4.3 代码演示

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode head = null;ListNode tail = null;//定义进位节点值int carry = 0;//当有一个链表不为空时,进入循环while(l1 != null || l2 != null) {//记录非空链表的节点值int n1 = l1 != null ? l1.val : 0;int n2 = l2 != null ? l2.val : 0;//记录总数int sum = n1 + n2 + carry;if(head == null) {head = tail = new ListNode(sum%10);} else {tail.next = new ListNode(sum%10);tail = tail.next;}//更新carry的值carry = sum / 10;//当链表不为空时,继续遍历两个链表if(l1 != null) {l1 = l1.next;}if(l2 != null) {l2 = l2.next;}}if(carry > 0) {tail.next = new ListNode(carry);tail = tail.next;}return head;}

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

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

相关文章

【Linux系统编程】命令模式2

目录 一&#xff0c;Linux下的初阶认识 1&#xff0c;管道 2&#xff0c;时间戳 二&#xff0c;Liunx系统命令操作 1&#xff0c;date时间指令 2&#xff0c;cal日历指令 3&#xff0c;which和find查找指令 3-1&#xff0c;which指令&#xff1a; 3-2&#xff0c;find…

分享一个python无人超市管理系统django项目实战源码调试 lw 开题

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

[Linux 基础] make、Makefile自动化构建代码工具

文章目录 1、make与Makefile是什么2、为什么要有make与Makefile3、怎么实现一个Makefile文件3.1 如何编写Makefile文件3.1.1 依赖关系3.1.2 依赖方法 3.2 如何清理项目3.2.1 如何编写3.2.2 clean详解 3.3 make的使用3.4 原理3.4.1 查看文件修改时间 1、make与Makefile是什么 m…

【王道代码】【2.3链表】d3

关键字&#xff1a; 奇偶序号拆分、a1&#xff0c;b1&#xff0c;a2&#xff0c;b2...an&#xff0c;bn拆分a1&#xff0c;a2...&#xff0c;bn&#xff0c;...b2&#xff0c;b1、删除相同元素

比例运算放大电路为什么要加平衡电阻

这个是反相比例运算放大电路&#xff0c;输出电压等于-Rf/R1乘以输入电压。 这个是同相比例运算放大电路&#xff0c;输出电压等于1Rf/R1乘以输入电压。 大家可以看到这两个电路中&#xff0c;都有一个电阻R2&#xff0c;反相比例运算放大电路放在同相端到地&#xff0c;同相比…

二叉排序树(BST)

二叉排序树 基本介绍 二叉排序树创建和遍历 class Node:"""创建 Node 节点"""value: int 0left Noneright Nonedef __init__(self, value: int):self.value valuedef add(self, node):"""添加节点node 表示要添加的节点&quo…

【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )

文章目录 一、继承 组合 模式的类对象 构造函数和析构函数调用规则1、场景说明2、调用规则 二、完整代码示例分析1、代码分析2、代码示例 一、继承 组合 模式的类对象 构造函数和析构函数调用规则 1、场景说明 如果一个类 既 继承了 基类 ,又 在类中 维护了一个 其它类型 的…

找不到conda可执行文件:解决方法

1.在新版本的pycharm出现的问题如下&#xff1a; 2.解决方法: 2.1 将anaconda\Scripts\conda.exe选中 2.2选择自己的anconda自己的环境&#xff0c;之后就可以正常创建conda环境

2023-10-23 LeetCode每日一题(老人的数目)

2023-10-23每日一题 一、题目编号 2678. 老人的数目二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的字符串 details 。details 中每个元素都是一位乘客的信息&#xff0c;信息用长度为 15 的字符串表示&#xff0c;表示方式如下&#xff1a; 前十…

橙河网络:国外问卷调查赚钱的项目可靠吗?

国外问卷调查项目是可靠的&#xff0c;是一个长期稳定的互联网项目。 大家好&#xff0c;我是橙河网络&#xff0c;今天聊一聊国外问卷调查赚钱的项目可靠吗&#xff1f; 在海外地区&#xff0c;很多公司和机构&#xff0c;它们为了收集一些关于产品和服务的消费者意见&#…

深入浅出Apache SeaTunnel SQL Server Sink Connector

在大数据时代&#xff0c;数据的迁移和流动已经变得日益重要。为了使数据能够更加高效地从一个源流向另一个目标&#xff0c;我们需要可靠、高效和易于配置的工具。今天&#xff0c;我们将介绍 JDBC SQL Server Sink Connector&#xff0c;这是一个专为 SQL Server 设计的连接器…

MyBatis-Plus实现逻辑删除[MyBatis-Plus系列] - 492篇

历史文章&#xff08;文章累计490&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 M…

【鸿蒙软件开发】文本输入(TextInput/TextArea)

文章目录 前言一、输入框1.1 创建输入框单行输入框多行输入框单行和多行输入框的区别 1.2 设置输入框的类型有哪些类型基本输入模式&#xff08;默认类型&#xff09;密码输入模式 1.3 自定义样式设置无输入时的提示文本设置输入框当前的文本内容。添加backgroundColor改变输入…

MECE分析法

1、前言 前段时间在对项目进行问题分析的时候&#xff0c;领导要求要符合MECE原则&#xff0c;做到逻辑完整而不能遗漏。虽然没听过这个原则&#xff0c;但是总感觉很有道理&#xff08;领导说的都对&#xff09;。于是乎&#xff0c;就找了一些资料了解了一下。 MECE分析法是…

【Rust】4 一文讲解重点 pattern matching | trait | 生命周期 | 闭包 | 迭代器 | 智能指针 | 并发与并行

文章目录 一、pattern matching二、trait2.1 常见 trait2.1.1 Copy 和 Clone2.1.2 PartialEq 和 Eq2.1.3 PartialOrd 和 Ord2.1.4 Hash2.1.5 From, Into, TryFrom, TryInto 2.2 概念2.2.1 关联类型2.2.2 关联常量2.3.3 泛型关联类型2.3.3.1 示例: 用泛型关联类型, 创建集合工厂…

快手进与退,快手董事长在辞任前套现37.78亿港元

快手科技&#xff08;1024.HK&#xff09;在港交所发布公告&#xff0c;宣布自2023年10月29日起&#xff0c;公司创始人宿华将不再担任董事会董事长&#xff0c;而继续担任执行董事和薪酬委员会成员&#xff0c;而他的不同投票权将保持不变。与此同时&#xff0c;快手科技的现任…

爱创科技携手洽洽食品,探索渠道数字化最优解!

坚果的下半场&#xff0c;是从吃到喝。 消费升级大潮下&#xff0c;健康养生理念逐渐深入人心。以“天然健康”为核心的食品新消费潮流正加速形成&#xff0c;一个个打着“美味与营养”黄金设定的品类风口正被不断创建&#xff0c;其中人气有增无减的当属植物基饮品。据相关报告…

【蓝桥杯001】

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;喜欢编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;小新爱学习. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc…

pv操作题目笔记

对于 pv 操作分以下几步走 什么是pv操作 PV操作在进程同步中通常指的是信号量&#xff08;Semaphore&#xff09;操作。信号量是一种用于控制多个并发进程或线程之间的同步和互斥访问的同步工具。PV操作通常涉及两个基本操作&#xff1a;P操作&#xff08;wait操作&#xff0…

024-第三代软件开发-TabView

第三代软件开发-TabView 文章目录 第三代软件开发-TabView项目介绍TabView官方示例 项目实际使用 关键字&#xff1a; Qt、 Qml、 TabView、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Langu…