• 刷题知识回顾《四》多数元素反转链表


    前言:由于在公司工作比较繁忙,导致之前刷的算法题忘记了许多,因此最近要大量回顾之前刷过的算法题,旨在有利于自己更好的复习,想跟着学习或复习的小伙伴儿们也可以参考一下🤞🤞
    如果有什么需要改进的地方还请大佬斧正😁
    小威在此先感谢诸佬了👏👏
    在这里插入图片描述

    🏠个人主页:小威要向诸佬学习呀
    🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
    目前状况🎉:目前大二,在一家满意的公司实习👏👏

    🎁如果大佬在准备面试,找工作,刷算法,可以使用我找实习前用的刷题神器哦刷题神器点这里哟
    💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

    牛客部分使用反馈,个人感觉还不错,帮我找到了心仪的公司,希望各位伙伴儿们通过它也能提高不少🥂🥂🥂

    以下正文开始

    在这里插入图片描述

    多数元素

    给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

    你可以假设数组是非空的,并且给定的数组总是存在多数元素。

    示例 1:

    输入:nums = [3,2,3]
    输出:3

    示例 2:

    输入:nums = [2,2,1,1,1,2,2]
    输出:2

    思路:题目意思是让我们返回数组中最多的元素,并且一定会存在多数元素,因此最简单的一种方法就是调用库函数,返回中间值即可,只不过复杂度会比其他方法高一点。当然也可以用哈希表法,摩尔投票法等。

    代码一:

    class Solution {
        public int majorityElement(int[] nums) {
            Arrays.sort(nums);//调用库函数排序
            return nums[nums.length/2];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    代码二:

    class Solution {
        public int majorityElement(int[] nums) {
            Map <Integer,Integer> obj =new HashMap<>();//定义哈希表
            for(int num:nums){
                obj.put(num,obj.getOrDefault(num,0)+1);//在集合中取,取不到则采用默认值0
                //getOrDefault(Object key, V defaultValue)意思就是当Map集合中有这个key时,就使用这个key对应的value值,如果没有就使用默认值defaultValue
                if(obj.get(num) > nums.length/2) return num;//如果超过半数,直接返回
            }
            return 0;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    代码三:

    class Solution {
        public int majorityElement(int[] nums) {
            int vote = nums[0];
            int count = 1;
            for (int i = 1; i < nums.length; i++) {
                // 票数count为0时,更换候选人,并将count重置为1
                if (count == 0) {
                    vote = nums[i];
                    count = 1;
                    continue;
                }
                // 遇到相同的则票数 + 1,遇到不同的则票数 - 1
                if (nums[i] == vote) {
                    count++;
                } else {
                    count--;
                }
            }
            return vote;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    反转链表

    给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

    示例 1:

    输入:head = [1,2,3,4,5]
    输出:[5,4,3,2,1]

    在这里插入图片描述

    示例 2:

    输入:head = [1,2]
    输出:[2,1]

    在这里插入图片描述

    示例 3:

    输入:head = []
    输出:[]

    思路:这道题是一道简单题,个人感觉用迭代法比较好一些吧,即定义一个空结点,依次遍历所给链表的每一个结点,将结点指向该空结点,然后该空结点往后移动,等遍历完成后,返回最初定义的节点即可。

    代码+详解:

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode() {}
     *     ListNode(int val) { this.val = val; }
     *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    class Solution {
        public ListNode reverseList(ListNode head) {
            //本题使用迭代法,一步一步地移动
            ListNode cur=head,pre=null,temp=cur;//cur当前节点,pre前一个节点,temp下面表示指向下一个节点
            while(cur!=null){
                temp=cur.next;//先保存当前节点的下一个节点,因为下面要变更cur的next节点
                cur.next=pre;//这里让cur指向前一个节点,依次循环,最后返回pre节点就好
                pre=cur;//pre节点往后面移动
                cur=temp;//cur节点往后面移动
            }
            return pre;//返回pre即为倒序排列
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

  • 相关阅读:
    基于JavaSwing开发教学软件(在线考试测评)+报告+说明书 大作业 毕业设计
    华为交换机S5735S-L24T4S-QA2无法telnet远程访问
    python进行微积分运算——sympy库简介
    YUV图像格式
    什么是Docker容器?Docker容器和VM有什么区别?
    Kubernetes新增节点
    LeetCode 1345、1371
    微信H5公众号获取openid爬坑记
    无代码开发添加数据入门教程
    计算机毕业设计Java网上鲜花店网站(源码+系统+mysql数据库+Lw文档)
  • 原文地址:https://blog.csdn.net/qq_53847859/article/details/126492327