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

news2024/11/17 11:36:32

在这里插入图片描述

🐌个人主页: 🐌 叶落闲庭
💨我的专栏:💨
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.coloradmin.cn/o/1125315.html

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

相关文章

1024程序员节特辑 | 深度解析C/C++内存管理(建议收藏!!)

1024程序员节特辑 | 深度解析C/C内存管理&#xff08;建议收藏&#xff01;&#xff01;&#xff09; 一、C/C内存分布1.1 相关例题 二、 C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free2.1 相关面试题 三、C内存管理方式3.1 new/delete操作内置类型3.2 new和…

通过字符设备驱动的分步实现编写LED驱动,另外实现特备文件和设备的绑定

头文件.h文件 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct {unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; } gpio_t; #define PHY_LED1_ADDR 0X50006000 #define PHY_LED2_ADDR 0X5000700…

程序员网上接单盛行,到底该怎样选择一个好用不坑的接单平台?

现在&#xff0c;选择在网上接单的程序员是越来越多了&#xff0c;与此同时&#xff0c;网上接单的平台也是越来越多了&#xff0c;五花八门的平台&#xff0c;哪个最靠谱&#xff1f;哪个资源丰富一些&#xff1f; 这些问题是不是也让你犹豫了呢&#xff1f;不用担心&#xf…

红队打靶:Misdirection打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现与端口扫描 第二步&#xff1a;Web渗透&#xff08;80端口&#xff0c;战术放弃&#xff09; 第三步&#xff1a;Web渗透&#xff08;8080端口&#xff09; 第四步&#xff1a;sudo bash提权 第五步&#xff1a;/etc/passwd利…

Qt程序的发布和打包,任何电脑都可以安装

## 1. Qt程序的发布 当Qt程序编写完成通过IDE编译就可以得到对应的可执行程序,这个可执行程序在本地运行是完全没有问题的(因为在本地有Qt环境,程序运行过程中可以加载到相关的动态库),但是如果我们想把这个Qt程序给到其他小伙伴使用可能就会出问题了,原因如下: 对方电…

Leetcode刷题详解——二分查找

1. 题目链接&#xff1a;704. 二分查找 2. 题目描述&#xff1a; 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1…

【线程本地变量ThreadLocal】—— 每天一点小知识

&#x1f4a7; 线程本地变量 T h r e a d L o c a l \color{#FF1493}{线程本地变量ThreadLocal} 线程本地变量ThreadLocal&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433;…

ES挂载不上怎么处理?

全文搜索 EelasticSearch安装 Docker安装 docker run -d --name es7 -e ES_JAVA_POTS"-Xms256m -Xmx256m" -e "discovery.typesingle-node" -v /home/206/es7/data/:/usr/share/elasticsearch/data -p 9200:9200 -p 9300:9300 elasticsearch:7.14.0 …

CANoe-使用IG Ethernet Packet Builder实现IP包分片的若干问题

在文章《CANoe-Ethernet IG和Ethernet Packet Builder的使用和区别》中,我们讲过Packet Builder可以组装多种类型的以太网报文: 当我们想组装一条icmpv4 echo request报文,payload只有1个字节的数据FF时,选择ICMPv4 Packet,创建一条ICMPv4报文,把payload改为1个字节: 然…

【类和对象之构造方法】

文章目录 用构造方法初始化对象格式&#xff1a;public类名特性 快捷键生成构造方法访问修饰限定符总结 用构造方法初始化对象 格式&#xff1a;public类名 注意区分成员方法和构造方法 两者都是在类当中但是成员方法的格式是public返回值方法名参数成员方法有参数&#xff…

Java中整数基础知识

原文链接 Java中整数基础知识 最近做了一道题&#xff0c;非常有意思&#xff0c;题本身很简单&#xff0c;但涉及到整数的最大值以及最小值&#xff0c;当写测试用例的时候&#xff0c;却犯了一个错误&#xff0c;发现最小整数并不是0xFFFFFFFF&#xff0c;我们来仔细看一下。…

网络协议--UDP:用户数据报协议

11.1 引言 UDP是一个简单的面向数据报的运输层协议&#xff1a;进程的每个输出操作都正好产生一个UDP数据报&#xff0c;并组装成一份待发送的IP数据报。这与面向流字符的协议不同&#xff0c;如TCP&#xff0c;应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联…

Citrix XenDesktop云桌面单点登录XenApp虚拟应用小技巧

哈喽大家好,欢迎来到虚拟化时代君(XNHCYL)。 “ 大家好,我是虚拟化时代君,一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利……(每天更新不间断,福利不见不散)” 第1章 前言 实现XenDesktop的桌面打开XenApp发布的应用…

为什么我们从github clone下来的maven项目本地运行报错

github上的项目clone到本地&#xff0c;比如是个Springboot的项目&#xff0c;我们用idea运行莫名其妙的报各种问题&#xff0c;常见的有以下异常&#xff1a; java.lang.NoClassDefFoundError&#xff1a;xxxxjava.lang.ClassNotFoundException:xxxxxjava.lang.NoSuchMethodE…

64 最长公共子序列

最长公共子序列 题解1 DP 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的 最长公共子序列的长度。如果不存在 公共子序列&#xff0c;返回 0 。 一个字符串的子序列是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些…

【CCF】Z字形扫描

这题的关键是将整个扫描的过程&#xff0c;拆分成很多次斜着操作数组的过程。 而且这个过程中可以建立如下规律&#xff1a; &#xff08;1&#xff09;一斜线上的元素个数与切换到下一条斜线这一操作之间建立规律。 先讨论左上部分的数组&#xff1a; 1&#xff09;当元素个…

本地部署Stackedit Markdown编辑器并通过cpolar内网穿透实现远程访问

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器&#xff0c;在GitHub上拥有20.7k Star&#xff01;&#xff0c;它支持将Markdown笔记保…

指针-Pointer

0.1 地址 &#xff08;1&#xff09;字节&#xff08;Byte) 一个字节存储8位无符号数&#xff08;1Byte 8 bit)&#xff0c;每个字节储存的数值范围为0-255 &#xff08;2&#xff09;内存 1G 1024M 、1M 1024K 、 1K 1024Byte 、1Byte 8 bit &#xff08;3&#xff…

谈谈你对spring boot 3.0的理解

谈谈你对spring boot 3.0的理解 一&#xff0c;Spring Boot 3.0 的兼容性 Spring Boot 3.0 在兼容性方面做出了很大的努力&#xff0c;以支持存量项目和老项目。尽管如此&#xff0c;仍需注意以下几点&#xff1a; Java 版本要求&#xff1a;Spring Boot 3.0 要求使用 Java 1…

高等数学啃书汇总重难点(五)定积分

最近都在忙着刷题&#xff0c;尤其是政治和英语也开始加量复习了&#xff0c;该系列断更了将近2个月~不过最近在刷题的时候又遇到一些瓶颈&#xff0c;因此回归基础来整理一下知史点~ 总的来说&#xff0c;虽然第五章也是重中之重&#xff0c;定理数量也很多&#xff0c;但&…