- 博客(35)
- 收藏
- 关注
原创 LRU缓存机制
问题: 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少...
2020-02-28 17:29:45
126
原创 字符串相乘(大数相乘)
问题: 给出两个字符串表示的正整数,求其乘积,返回其乘积的字符串表示。思路: 用一个数组存储乘积,第i位与第j位的乘积累积保存到数组的第i+j+1位,后对数组每一位做进位操作。java代码:public String multiply(String num1,String num2){ int len1=num1.length(),len2=num2.length(); ...
2020-02-27 23:21:12
290
原创 产生括号
问题: 打印出所有N对合理的括号组合。思路: 用递归函数生成括号组合,参数为左右括号余量和当前位置,以及已生成的组合。结束条件为余量为0,否则余量减一继续调用。java代码: public void printPar(int N){ char[] str=new char[2*N]; printPar(N,N,str,0); } private...
2020-02-27 21:48:56
119
原创 平衡二叉树
问题: 给出一棵二叉树,判断其是否为平衡二叉树。思路: 首先,平衡二叉树的定义:平衡二叉树要么是一棵空树,要么是具有以下性质的二叉树–它的左子树和右子树都是平衡二叉树,且左子树和右子树的高度之差的绝对值不超过1。 递归处理左右子树,根据左右子树的结果返回树的高度。java代码:public boolean isBalanced(TreeNode root){ return (...
2020-02-27 21:15:07
99
原创 路径和 I
问题: 给定一棵二叉树和一个值,判断是否存在从根到叶子节点的路径和等于给定的值。思路: 采用递归的方式,如果当前为非叶子节点,递归处理其子节点,传递目标值减去当前节点的值,如果是叶子节点,比较当前值和目标值,如果为空,返回False。java代码:public boolean hasPathSum(TreeNode root,int sum){ if(root==null)...
2020-02-27 20:15:51
84
原创 最小公共祖先 IV
题目: 给定两个节点,求它们在一个普通树中的最小公共祖先。思路: 采用广度优先遍历找到节点,将所有节点父节点存入哈希表,当找到节点时回溯哈希表实现到树根的路径。找两条路径的交点。java代码:class TreeNode{ int val; ArrayList<TreeNode> children; } TreeNode LCA4(...
2020-02-27 19:51:40
168
原创 最小公共祖先 III
问题: 给定两个子节点,求在二叉树中的最小公共祖先。思路: 最小公共祖先有两种情况:1)两个节点为祖子关系;2)两个节点分别在最小公共祖先两侧;考虑这样一种遍历方式,先处理当前节点,若为两节点之一则返回,然后分别递归调用处理左右节点,再结合左右子树的处理结果返回最终结果。TreeNode LCA3(TreeNode root,TreeNode p,TreeNode q){ i...
2020-02-27 18:34:22
254
原创 最小公共祖先 II
问题: 给定两个节点,求它们在一棵二叉树中的最小公共祖先。每个节点除了有左右子树外,还有一个指向其父节点的指针。思路: 由于有指向父节点的指针,两个节点沿着父指针到达根节点形成两根链表,问题转化为求两链表交点。先分别求链表长度,再将两链表放在同一起点,同时前进直到相遇。java代码:TreeNode LCA2(TreeNode root,TreeNode p,TreeNode q){ ...
2020-02-27 18:14:49
361
1
原创 最小公共祖先 I
问题: 给定个两个节点,求它们在一棵二叉搜索树中的最小公共祖先。思路: 从根节点开始,找到第一个值在两节点之间的节点,即为最小公共祖先。java代码:TreeNode LCA(TreeNode root,TreeNode p,TreeNode q){ if(root==null||p==null||q==null) return null; ...
2020-02-27 17:57:08
770
原创 图书管理系统(Borrowers,UVa230)
题目链接: 图书管理系统(UVa230)C++代码:#include <string>#include <set>#include <iostream>#include <cassert>#include <vector>#include <map>using namespace std;struct Bo...
2020-02-26 23:59:44
182
原创 打印队列(Printer Queue,UVa12100)
题目链接: 打印队列(UVa12100)C++代码:#include<queue>#include <cstdio>#include <cassert>using namespace std;int readint(){ int x; scanf("%d",&x); return x;}const int MAX...
2020-02-26 20:49:01
659
原创 循环小数(Repeating Decimals,UVa202)
Sample Input76 255 431 397Sample Output76/25 = 3.04(0)1 = number of digits in repeating cycle5/43 = 0.(116279069767441860465)21 = number of digits in repeating cycle1/397 = 0.(002518891687657...
2020-02-26 00:50:56
127
原创 IP网络(IP Networks,UVa1590)
Sample Input3194.85.160.177194.85.160.183194.85.160.178Sample Output194.85.160.176255.255.255.248C++代码:#include<stdio.h>#include <cstring>#include <algorithm>#include<...
2020-02-26 00:47:25
226
原创 谜题(Puzzle,UVa227)
Sample InputTRGSJXDOKIM VLNWPABEUQHCFARRBBL0ABCDEFGHIJKLMNOPQRSTUVWXAAALLLL0ABCDEFGHIJKLMNOPQRSTUVWXAAAAABBRRRLL0ZSample OutputPuzzle #1:T R G S JX O K L IM D V B NW P A EU ...
2020-02-15 23:17:12
279
原创 纵横字谜的答案(Crossword Answers,UVa232)
Sample Input2 2ATO6 7AIMDENMEONEUPONTOSOERINSAOR*IES*DEA0Sample Outputpuzzle #1:Across1.AT3.ODown1.A2.TOpuzzle #2:Across1.AIM4.DEN7.ME8.ONE9.UPON11.TO12.SO13.ERIN15.SA17...
2020-02-15 23:09:38
206
原创 螺旋矩阵
问题: 给定一个m*n矩阵,按螺旋顺序返回所有元素。思路: 按从左到右、从上到下、从右到左和从下到上四个方向构建循环,设置四个移动边界。java代码:int[] searchRange(int A[],int target){ int[] range=[-1,-1]; int lower=0,upper=A.length,mid; if(A[u...
2020-02-14 20:57:59
92
原创 区间搜索
问题: 给定一个有序数组(该数组元素可能含有相同值)和一个目标值,找出目标值的起止下标,如果数组不含邮该目标值,则返回【-1,-1】。要求时间复杂度为O(log(n)),n为数组长度。思路: 二分查找,分别找到目标值的上下边界。java代码:int[] searchRange(int A[],int target){ int[] range=[-1,-1]; ...
2020-02-14 18:35:28
308
1
原创 首个正数
问题: 给定一个无序整型数组,找出第一个不再数组里的正整数。要求时间复杂度O(n),空间复杂度为O(1)。思路: 将数组转变成哈希表,将等于i的值放在下标为i-1处。最后遍历数组,i处的值若不为i+1,则输出整数i+1。java代码:int firstMissingPositive(int A[]){ int n=A.length; for(int i=0;i...
2020-02-14 18:11:34
104
原创 链表分区
问题: 给定一个链表和一个值x,把链表一分为二,即将小于x的所有节点放在大于或等于x的节点前,并保存节点的原有相对顺序。思路: 使用一个指针指向分界点,遍历链表,遇到小于x的节点插入到分界点。java代码:ListNode partitionLinkedList(ListNode head,int x){ ListNode curr=head; ListNod...
2020-02-13 20:51:14
672
原创 两数相加
问题: 给出两个正整数,每个整数由一个链表表示。其中链表的每个节点保存数的数位,这些数位反序存在在链表中,即高位在尾部,低位在头部。返回一个链表代表这两个数之和。java代码:public ListNode addTwoNumbers(ListNode l1,ListNode l2){ ListNode iter1=l1,iter2=l1; ListNode i...
2020-02-13 19:55:37
77
原创 分组反转链表
问题: 反转一个链表中的每K个节点,如果链表长度不能被K整除,则最后余数节点保持不变。思路: 分组,对每个分组进行链表转置。关键设计转置函数,对组内元素迭代反转。java代码:ListNode reverseKGroup(ListNode head,int k){ if(head==null||k<=1) return head; ...
2020-02-13 19:51:57
479
原创 反转链表
问题: 分别用递归和非递归方式来实现反转链表。思路1: 递归。java代码:ListNode reverseList(ListNode head,ListNode newHead){ if(head==null||head.next==null){ newHead=head; return head; } ...
2020-02-12 18:34:27
87
原创 环的长度
问题: 给出一个单向链表的头指针,如果有环,则返回环的长度,否则返回0。思路: 使用两个指针,移动速度一快一慢,若快指针先达到尾部,则无环,若快指针追上慢指针,则快指针多走一个环的长度。java代码: int getCircleLength(ListNode head){ ListNode slow=head; if(slow==null||slow.next...
2020-02-12 17:30:27
351
原创 合并链表
问题: 合并两个有序链表,返回合并后的有序链表头。不允许利用额外的线性存储空间。思路: 申请一个新节点,比较两链表表头,将两链表串在新节点后。java代码:ListNode mergeTwoList(ListNode l1,ListNode l2){ ListNode dummy=new ListNode(0); ListNode cur=dummy; ...
2020-02-12 16:54:33
99
原创 Top K II
问题: 给定一维整型数组和一个整数K,找出和不小于K的数目最少的子数组。思路: 改进快排分区思路(见Top K)。对数组进行降序排列,分区同时计算左边数之和...
2020-02-12 16:22:03
114
原创 Top K
问题: 求一维数组中的最小的k个数。思路1: 排序。把数组从小到大排序,取前k个数。若数组过大,机器内存无法同时容纳整个数组,则需要使用外部排序。思路2: 堆。创建一个最小堆,初始化大小为k;堆顶为堆的最大元素。扫描一遍数组得到k个最小元素。思路3: 快排分区。对数组调用分区函数,如果返回的下标是k-1,那么数组左边的k个数就是结果。思路3 java代码:int partition(in...
2020-02-10 22:20:45
77
原创 产生随机数
问题: 给出一个整型数组,以及数组的最大值max和最小值min,写一个函数产生一个在【min,max】范围内的随机数,该随机数并不在数组里。假设总能找到该随机数。思路: 产生随机数,对数组排序,二分查找。java代码:void numInRange(int[] intList,int min,int max){ Arrays.sort(intList); in...
2020-02-10 21:05:56
134
原创 数位重组
问题: 给定两个数组表示的整数,比如x=1234={1,2,3,4},y=2410={2,4,1,0},返回第一个整数的重组后的值最接近第二个整数,并且大于第二个整数。假设两个整数的数组大小相同,并且肯定能找出符合条件的数。思路: 先对x进行排序,从x中挑出一个与y对应的相等或更大的数字,如果挑出相等的放入结果集,继续上述操作,直到找到一个更大的数字。后面的数位递增放入。int[] getCl...
2020-02-10 20:38:28
593
原创 数组配对
问题: 给定N个整数,N为偶数,是否能找到N/2对,使得每对和能被K整除。注意:每个元素只能出现在一个配对中。思路: 创建一个长度为K的数组,将整数的个数按照余数分类存储到数组中,分析余数情况。boolean checkPairable(int[] nums,int k){ if(k<0) return false; int[] c...
2020-02-10 19:58:20
513
原创 合并区间
问题: 给定一个区间集合,合并里面重叠当区间,并返回新的不含重叠区间当集合。例如,输入:【1,5】,【6,10】,【4,6】,【15,20】。输出:【1,10】,【15,20】。思路: 先对区间集合排序,申请一块结果集空间,扫描原始集合,一个一个放入结果集,若即将放入的区间与结果集尾部区间重叠,则两两合并再放入,若不重叠,则直接放入。java代码:ArrayList<Interval&...
2020-02-09 22:44:26
105
原创 最大重叠区间个数
问题: 给定多个可能重叠的区间,找出重叠区间的个数的最大值。区间定义如下:public class Interval{ int start; //起点 int end; //止点 Interval(int a,int b){ start=a; end=b; }}思路: 将区间边界转换成点,对所有点进行排序,扫描排序结果。当遇到...
2020-02-09 22:35:30
5628
3
原创 最大下标距离
问题: 给定一个整型数组,找出最大下标距离j-i, 当且仅当A[i]<A[j]和i<j。思路: 记录从第一个元素开始的下降序列,因为A[i]一定会出现在其中,然后从尾部开始扫描,i从下降序列开始扫描,j从数组尾部开始扫描,记录符合条件A[i]<A[j]的距离最大值。java代码:int maxIndexDistance(int A[]){ if(A==nul...
2020-02-09 22:25:06
330
原创 两数之和-II
问题:给定一个整型数组,找出其中的两个数使其和为某个指定的值,并返回这两个数的下标。假设数组元素的值各不相同,则要求时间复杂度为O(n), n为数组的长度。思路:扫描一遍数组,把键值<value, index>存入哈希表,再次扫描检查target与当前的差值是否在哈希表中。java实现: int[] twoSum(int[] A,int target){ i...
2020-01-29 12:12:26
94
原创 两数之和-I
问题:给定一个整型数组,是否能找出其中的两个数使其合为某个指定 的值?思路:排序后,从数组两端向中间移动,一次移动一端的指针,直至两数合为为指定值。java实现:boolean hasSum(int[] A,int target) { boolean res = false; if (A == null || A.length < 2) ...
2020-01-29 11:36:41
118
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人