前言:由于在公司工作比较繁忙,导致之前刷的算法题忘记了许多,因此最近要大量回顾之前刷过的算法题,旨在有利于自己更好的复习,想跟着学习或复习的小伙伴儿们也可以参考一下🤞🤞
如果有什么需要改进的地方还请大佬斧正😁
小威在此先感谢诸佬了👏👏
🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:目前大二,在一家满意的公司实习👏👏🎁如果大佬在准备面试,找工作,刷算法,可以使用我找实习前用的刷题神器哦刷题神器点这里哟
💕欢迎大家:这里是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即为倒序排列
}
}