数据结构
数据结构
星星的博客
一个java爱好者,希望与大家共同进步!
展开
-
对自己LRU算法代码的优化
吾日三省吾身原创 2022-07-21 11:46:12 · 195 阅读 · 0 评论 -
LRU内存淘汰算法【大厂面试算法题】
题目描述运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之原创 2021-07-23 22:48:29 · 206 阅读 · 1 评论 -
在二叉树中找到两个节点的最近公共祖先【大厂算法面试题】
题目描述给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。注:本题保证二叉树中每个节点的val值均不相同。输入:[3,5,1,6,2,0,8,#,#,7,4],5,1输出: 3解题思路由于递归要返回树的左子树或者右子树节点,而题目给出的返回值为int所以我们这里自己定义一个递归方法。如果root == null 就说明root走到底了,如果root等于o1或者o2就说明o1或者o2是另一个的父节点,就直接返回root即可原创 2021-07-22 10:18:50 · 300 阅读 · 0 评论 -
重建二叉树【大厂算法面试题】
题目描述给定某二叉树的前序遍历和中序遍历,请重建出该二叉树并返回它的头结点。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。提示:1.0 <= pre.length <= 20002.vin.length == pre.length3.0 <= pre[i], vin[i] <= 100004.pre 和 vin 均无重复元素5.vin出现的元素均出现在 pre里6.只需要返回根结点,系统原创 2021-07-21 22:52:06 · 155 阅读 · 2 评论 -
两个链表的第一个公共结点【大厂算法面试题】
题目描述输入两个无环的单链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)解题思路我们可以定义两个指针,p1和p2,分别指向两个链表的头节点,然后当p1(或者p2)等于 null时,将p1(或者p2)指向p2头节点(或者p1头节点),如果他们相等,将其返回。代码实现/*public class ListNode { int val; ListNode next = null; ListNode(in原创 2021-07-20 20:58:29 · 84 阅读 · 0 评论 -
一道有关数组正赋值排序的面试题
前言上周星期天,我跟一个前一段时间在深圳找工作的学长聊天,他告诉 我他找了一份5位数薪资的工作,当时我也很高兴,然后我接着问了他遇到了哪些面试题,然后他就跟我分享了一道题,题目是这样的:给定一个整型数组,其中的数值有正有负(我们暂时认为0也算是正数部分),现在请调整位置,把所有负值调到数组的左边,把所有正直调到数组右边。思路用一个指针i从前往后找第一个正数,用一个指针j从后往前找第一个负数,找到以后并且i<j,那么就将他们位置互换。这样,就完成了排序,代码如下:package intervi原创 2020-11-18 15:01:19 · 1871 阅读 · 16 评论 -
数组只出现一次的数(其他数出现K次)【大厂算法面试题】
题目描述给定一个整型数组 arrarr 和一个整数 k(k>1)k(k>1)。已知 arrarr 中只有 1 个数出现一次,其他的数都出现 kk 次。请返回只出现了 1 次的数。解题思路用一个map记录每个数出现的次数,如果出现多次,就标记为false,然后再遍历map,寻找value为true的key就是出现一次的数代码实现import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定原创 2021-07-16 22:05:14 · 390 阅读 · 0 评论 -
删除链表的倒数第n个节点【大厂面试算法题】
题目描述给定一个链表,删除链表的倒数第 nn 个节点并返回链表的头指针例如,给出的链表为: 1→2→3→4→5, n=2.删除了链表的倒数第 n 个节点之后,链表变为1→2→3→5.备注:题目保证 nn 一定是有效的请给出请给出时间复杂度为\ O(n) O(n) 的算法解题思路把原链表前面加一个头节点,慢指针从新头节点开始跑,快指针从老头节点开始跑,先用快指针跑k个节点,然后再快慢指针一起跑,当快指针到达null时,删除慢指针后面的节点即可代码实现import java.util.*;原创 2021-07-16 10:53:25 · 119 阅读 · 0 评论 -
买股票的最好时机【大厂算法面试题】
题目描述数组里的每个元素代表每一天的价格情况,请计算这段时间最多能挣多少。示例:输入:[1,4,2]返回:3解释:第一天买,第二天卖,4-1=3;输入:[2,4,1]返回:2解释:第一套买,第二天卖,4-2=2;解题思路用一个变量记录当前天的最小值(从第二天开始),然后用每天减去这个最小值,得出的结果保留一个最大值并将其返回则是题目所需要的答案。代码实现import java.util.*;public class Solution { /** *原创 2021-07-15 16:50:18 · 90 阅读 · 0 评论 -
合并两个有序数组【大厂算法面试题】
题目描述给出一个整数数组 A和有序的整数数组 B,请将数组 合并到数组 A中,变成一个有序的升序数组注意:1.可以假设 A数组有足够的空间存放 B数组的元素, 和 中初始的元素数目分别为 m和 n,的数组空间大小为 m + n2.不要返回合并的数组,返回是空的,将数组 B的数据合并到A里面就好了3.A数组在[0,m-1]的范围也是有序的解题思路由于A数组的容量足够大,并且,A数组和B数组都是有序的,我们可以从A数组的后面进行比较并赋值。代码实现public class Solution {原创 2021-07-15 15:38:13 · 404 阅读 · 0 评论 -
寻找第K大的数【大厂算法面试题】
题目描述有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。给定一个整数数组a,同时给定它的大小n和要找的K(1<=K<=n),请返回第K大的数(包括重复的元素,不用去重),保证答案存在。解题思路利用大根堆的特点,把数组元素放进大根堆,然后再删除K-1个最大的元素,剩下的最大数就是第K大的数。代码实现package heap;import java.util.PriorityQueue;public class _寻找第K大的数 { public stat原创 2021-07-15 11:59:04 · 212 阅读 · 0 评论 -
替换空格【Shein算法笔试题】
题目描述请实现一个函数,把字符串 s 中的每个空格替换成"%20"。解题思路定义一个StringBuilder,如果s.charAt(i) == ‘ ’则替换为"%20"代码实现 public String replaceSpace(String s) { StringBuilder sb = new StringBuilder(); for(int i = 0;i < s.length();i++) { if(s.charAt(i)原创 2021-07-14 13:34:04 · 863 阅读 · 1 评论 -
树的前序,中序,后序遍历【大厂算法面试题】
题目描述分别按照二叉树先序,中序和后序打印所有的节点。示例输入:{1,2,3}输出:[[1,2,3],[2,1,3],[2,3,1]]解题思路写用三个List和三个方法,分别存储和计算先序,中序和后序的值,然后再装入res数组并返回。代码实现import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; *原创 2021-07-06 17:09:42 · 141 阅读 · 2 评论 -
单调不递减链表,删除掉重复值【大厂算法面试题】
题目描述在一个单调不递减链表中,删除掉重复出现的值。解题思路使用双指针,有两种情况:1、前指针指向的节点的值和后指针指向的节点的值相等就把后指针指向的节点删除,并且后指针指向新的后指针。2、两个指针指向的节点的值不相同,则两个指针分别向后走一步。代码实现package linkednode;import java.util.HashSet;import java.util.Set;public class _删除掉重复值 { public static void main(S原创 2021-07-05 17:34:16 · 101 阅读 · 0 评论 -
对链表值奇偶分离并排序【大厂算法面试题】
题目描述实现链表,无序链表,对链表值奇偶分离并排序,空间复杂度O(1)解题思路先自己定义一个链表,把数据放在链表里面,然后定义两个链表,对链表进行奇偶分离并排序。代码实现package linkednode;public class Node { int value; Node next; public Node(int value) { this.value = value; } public Node() {原创 2021-07-02 13:28:54 · 336 阅读 · 0 评论 -
一个n位的数,去掉其中的k位,使得留下来的那个(n-k)位的数最小【大厂算法面试题】
题目描述一个n位的数,去掉其中的k位,问怎样去掉使得留下来的那个(n-k)位的数最小?解题思路假设一个数为:123456789,k = 3,那么,去掉k个最大的数为123456。假设一个数为:987654321,k = 3,那么,去掉k个最大的数为654321。假设一个数为:192837465,k = 3,那么,去掉k个最大的数为123465我们可以发现,当第j位数>j+1位数时,我们可以将j删除。当找不到这样的数时,表示该数为非递减数列,例如123456789,这时候我们应该将最原创 2021-07-02 09:26:54 · 286 阅读 · 0 评论 -
链表实现队列【大厂算法面试题】
题目描述使用链表实现一个队列简单的基本功能。实现思路1、首先自己定义一个链表节点类Node,再定义一个队列类LinkedQueue。2、offer方法:我们首先判断头节点是否为空,如果为空,就先new一个head节点,接着把值放入head节点,在把tail节点指向head节点,否则,先new一个node节点,把node节点接入tail节点的下个节点,再把tail节点指向tail的下一个节点,让head节点始终保持指向头部节点,tail节点始终指向最后一个节点。3、poll方法:如果head不为空说原创 2021-06-29 13:41:32 · 99 阅读 · 0 评论 -
链表实现栈【大厂算法面试题】
题目描述自己手写链表实现一个栈的基本功能。做题思路1、首先自己定义一个链表节点类Node,再定义一个栈类Stack。2、push方法:我们首先判断头节点是否为空,如果为空,就先new一个head节点,接着把值放入head节点,否则,先new一个node节点,把head节点接入node的下个节点,再把head节点指向node节点。3、pop方法:如果head不为空说明栈中有值,把head节点的value拿出来,在把head节点往下走一步,原来的头节点回因为没有引用而被回收。4、peek方法:返回h原创 2021-06-29 12:59:21 · 97 阅读 · 0 评论 -
栈排序【大厂算法面试题】
题目描述栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1。解题思路我们用两个栈,一个原始栈用来存储全部数据,另一个临时栈用来模拟插入排序后移数组的操作,把插入的数据放在合适的位置后,在将临时栈的数据再放回原始栈。实现代码class SortedStack { private Stack<Integer原创 2021-06-29 12:49:48 · 81 阅读 · 0 评论 -
算法面试题 判断两个字符串是否个数相等
package string;public class SameString { public static void main(String[] args) { System.out.println(check("abc","abc")); } static boolean check(String s1,String s2) { int [] helper = new int[127]; for (int i = 0; i原创 2021-01-21 22:00:35 · 504 阅读 · 3 评论