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

发布于:2023-01-04 ⋅ 阅读:(346) ⋅ 点赞:(0)

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

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

🎁如果大佬在准备面试,找工作,刷算法,可以使用我找实习前用的刷题神器哦刷题神器点这里哟
💕欢迎大家:这里是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];
    }
}

代码二:

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;
    }
}

代码三:

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;
    }
}

反转链表

给你单链表的头节点 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即为倒序排列
    }
}

在这里插入图片描述