java算法练习
来杯茶的ni
因学习而年轻,因年轻而快乐
展开
-
算法练习--二叉树展开为链表
题目:给定一个二叉树,将它展开为一个单链表。示例:个人思路:其实就是进行前序遍历,用列表存储每个节点,然后对每个节点的指针进行修改代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int va原创 2020-08-11 13:46:35 · 163 阅读 · 0 评论 -
算法练习--打家劫舍 III--递归
题目:在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例:个人思路:用一个flag进行标记,为0表示不抢,那么最大金额来自左右子树的最大抢劫之和;为1表示抢,那么最大金额为该原创 2020-08-11 13:29:21 · 355 阅读 · 0 评论 -
算法练习--队列的最大值__单调队列
题目:请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value需要返回 -1示例:输入:["MaxQueue","push_back","push_back","max_value","pop_front","max_value"][[],[1],[2],[],[],[]]输出:[null,null,null,2,1,2...原创 2020-08-01 21:56:14 · 946 阅读 · 0 评论 -
算法练习--二叉搜索树的后序遍历序列__递归
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。示例:个人思路:根据二叉搜索树的后序遍历可以知道最后一个数是当前节点,而左树从开头开始并且比当前节点小的序列,右树是从左树之后到当前节点前一位。所以只要从头开始找到左右树的序列,在判断右树最后一个节点是不是当前节点的前一个,如果不是,那么无法构成二叉搜索树,同时二叉搜索树的左右子树也必须是二叉搜索树。代码:class Solu..原创 2020-08-01 21:43:32 · 195 阅读 · 0 评论 -
算法练习--矩阵中的最长递增路径__递归
题目:给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。示例:个人思路:通过递归,判断上一个值是否小于当前值,如果小于,那么长度加1,继续向下递归,否则返回当前长度。代码:class Solution { public int longestIncreasingPath(int[][] matrix) { int re=0; for(in原创 2020-08-01 21:15:46 · 290 阅读 · 0 评论 -
算法练习--回文链表__快慢指针、链表翻转
题目:编写一个函数,检查输入的链表是否是回文的。示例输入: 1->2输出: false 个人思路回文链表即字符左右对称,但是链表是单向的,这时我们就要让链表后半部分进行翻转,首先遍历链表获得长度,然后让快指针走到链表的后半部分开头,然后开始进行后半部分的链表翻转,翻转结束后快指针走到链表的结尾,这时让慢指针从链表头部开始,两指针向中间走,同时判断对应的值是否相等,不相等表示不是回文串,返回false,如果到中间了都相等,表示是回文。代码/** * Definitio原创 2020-06-02 17:35:32 · 198 阅读 · 0 评论 -
算法练习--回文排列__HashMap
题目给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词。示例输入:"tactcoa"输出:true(排列有"tacocat"、"atcocta",等等)个人思路回文串就是左右对称的字符串,这意味着最多只有一个字符的数量可以是单数(即正中间的字符),所以我们可以用一个map记录所有字符的数量,然后遍历数量看看是否最多只有一个为单数。代码class Solution原创 2020-06-02 17:22:29 · 177 阅读 · 0 评论 -
算法练习--移除重复节点__HashSet
题目编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。示例输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3]个人思路定义一个HashSet来存储值,通过它判断是否有重复节点。因为要涉及到节点的删除操作,那么我们需要知道节点的前驱,所以还要定义一个前驱节点,遍历链表,判断当前节点的值是否已经存在于set中,如果没有,表示不重复,链表向下遍历;否则,代表存在重复,需要删除当前节点。代码/** * Definition for singly-linke原创 2020-06-02 16:50:42 · 267 阅读 · 0 评论 -
算法练习--堆盘子__栈、ArrayList
题目:堆盘子。设想有一堆盘子,堆太高可能会倒下来。因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。请实现数据结构SetOfStacks,模拟这种行为。SetOfStacks应该由多个栈组成,并且在前一个栈填满时新建一个栈。此外,SetOfStacks.push()和SetOfStacks.pop()应该与普通栈的操作方法相同(也就是说,pop()返回的值,应该跟只有一个栈时的情况一样)。 进阶:实现一个popAt(int index)方法,根据指定的子栈,执行pop操作。当某个栈为空原创 2020-05-30 22:25:44 · 231 阅读 · 0 评论 -
算法练习--环路检测__快慢指针
题目:给定一个有环链表,实现一个算法返回环路的开头节点。有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路。示例:输入:head = [3,2,0,-4], pos = 1输出:tail connects to node index 1解释:链表中有一个环,其尾部连接到第二个节点。个人思路:用快慢指针进行遍历,如果有环,那么快指针和慢指针一定会相遇(跳出循环),如果没有则遍历到最后退出。如果快慢指针相同代表有环,然后让一个指针回到头部,两指原创 2020-05-30 22:12:18 · 368 阅读 · 0 评论 -
算法练习--链表求和
题目:给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。示例:输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295输出:2 -> 1 -> 9,即912个人思路:因为两个链表低位在前,所以直接遍历两个链表的值进行相加即可,加法得到的和可能大于10,那么要用个值来保存进位,用于下个节点相加,单其中一个链表遍历完时,那么原创 2020-05-30 21:24:55 · 335 阅读 · 0 评论 -
算法练习--分割链表__双指针
题目:编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。示例:输入: head = 3->5->8->5->10->2->1, x = 5输出: 3->1->2->10->5->5->8个人思路:定义两个指针分别放大于等于和小于的节点,遍历原创 2020-05-30 21:13:52 · 223 阅读 · 0 评论 -
算法练习--水域大小__深度优先
题目:你有一个用于表示一片土地的整数矩阵land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小,返回值需要从小到大排序。示例:输入:[ [0,2,1,0], [0,1,0,1], [1,1,0,1], [0,1,0,1]]输出: [1,2,4]个人思路:深度优先,遍历数组,如果为0,那么对其进行深度优先的递归,递归它上下左右和对角线,然后返原创 2020-05-30 21:06:24 · 3725 阅读 · 0 评论 -
算法练习--最小K个数
题目:设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。示例:输入: arr = [1,3,5,7,2,4,6,8], k = 4输出: [1,2,3,4]个人思路:其实就是排序,本人用来系统给的排序函数、快速排序(Mysort1)、堆排序(Mysort2)三种方法代码:class Solution { public int[] smallestK(int[] arr, int k) { // Arrays.sort(arr);原创 2020-05-28 18:33:13 · 306 阅读 · 0 评论 -
算法练习--LRU缓存机制__HashMap+链表
题目:运用你所掌握的数据结构,设计和实现一个LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果关键字 (key) 存在于缓存中,则获取关键字的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字/值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。示例:L..原创 2020-05-27 14:04:48 · 194 阅读 · 0 评论 -
算法练习--旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组[3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例:输入:[3,4,5,1,2]输出:1个人思路:因为原数组是递增数组,所以当有个值小于前一个值时,表明该值是原数组的第一个值,也就是最小值代码:class Solution { public int minArray(int[] numbe.原创 2020-05-19 22:09:07 · 176 阅读 · 0 评论 -
算法练习--k个一组翻转链表
题目:给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。示例:给你这个链表:1->2->3->4->5当k= 2 时,应当返回: 2->1->4->3->5当k= 3 时,应当返回: 3->2->1->4->5个人思路:我的解法有两种,代码中注释的是一种,没注释的是另...原创 2020-05-18 20:47:10 · 243 阅读 · 0 评论 -
算法练习--Pow(x,n)__二分法、递归
题目:实现pow(x,n),即计算 x 的 n 次幂函数。示例:输入: 2.00000, 10输出: 1024.00000个人思路:判断n是正数还是负数,如果是负数,则返回正数次幂的倒数。使用二分法,求一半的次幂,然后在平方(如果次幂为奇数,那么还需要再乘一次x)代码:class Solution { public double myPow(double x, int n) { long N=n; return N>=0?...原创 2020-05-17 21:21:29 · 278 阅读 · 0 评论 -
算法练习--翻转单词顺序
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。无空格字符构成一个单词。 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。示例:个人思路:将传入的字符串变为单词数组,然后从后重新遍历添加代码:class Solution {原创 2020-05-17 20:49:15 · 755 阅读 · 1 评论 -
算法练习--唯一摩尔斯密码词__HashSet
题目:国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串,比如: "a" 对应 ".-", "b" 对应 "-...", "c" 对应 "-.-.", 等等。为了方便,所有26个英文字母对应摩尔斯密码表如下:[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-","....原创 2020-05-06 20:14:10 · 161 阅读 · 0 评论 -
算法练习--机器人的运动范围
题目:地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能...原创 2020-03-25 21:50:47 · 296 阅读 · 0 评论 -
算法练习--将数组分成和相等的三个部分
题目:给你一个整数数组A,只有可以将其划分为三个和相等的非空部分时才返回true,否则返回 false。形式上,如果可以找出索引i+1 < j且满足(A[0] + A[1] + ... + A[i] == A[i+1] + A[i+2] + ... + A[j-1] == A[j] + A[j-1] + ... + A[A.length - 1])就可以将数组三等分。...原创 2020-03-25 21:41:27 · 358 阅读 · 0 评论 -
算法练习--礼物的最大价值
题目:在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例:输入:[[1,3,1],[1,5,1],[4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可...原创 2020-03-24 21:53:50 · 713 阅读 · 0 评论 -
算法练习--二维数组中的查找
题目:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10,...原创 2020-03-24 21:44:43 · 191 阅读 · 0 评论 -
算法练习--分糖果 II
题目:我们买了一些糖果 candies,打算把它们分给排好队的 n = num_people 个小朋友。给第一个小朋友 1 颗糖果,第二个小朋友 2 颗,依此类推,直到给最后一个小朋友 n颗糖果。然后,我们再回到队伍的起点,给第一个小朋友 n+ 1 颗糖果,第二个小朋友 n+ 2 颗,依此类推,直到给最后一个小朋友 2 * n颗糖果。重复上述过程(每次都比上一次多给出一颗糖果,当到达队...原创 2020-03-08 16:55:05 · 477 阅读 · 0 评论 -
算法练习--数组拆分
题目一:给定两个数组,编写一个函数来计算它们的交集。示例 :输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2]代码:class Solution { public int[] intersection(int[] nums1, int[] nums2) { Arrays.sort(nums1); A...原创 2020-03-06 00:38:46 · 224 阅读 · 0 评论 -
算法练习--替换空格
题目:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 :输入:s = "We are happy."输出:"We%20are%20happy."代码:class Solution { public String replaceSpace(String s) { char[] c=s.toCharArray(); St...原创 2020-03-06 00:18:17 · 216 阅读 · 0 评论 -
算法练习--机器人能否返回原点
题目:在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在(0, 0) 处结束。移动顺序由字符串表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有R(右),L(左),U(上)和 D(下)。如果机器人在完成所有动作后返回原点,则返回 true。否则,返回 false。注意:机器人“面朝”的方向无关紧要。 “R” 将...原创 2020-03-04 23:36:44 · 187 阅读 · 0 评论 -
算法练习-- 6 和 9 组成的最大数字
题目:给你一个仅由数字 6 和 9 组成的正整数num。你最多只能翻转一位数字,将 6 变成9,或者把9 变成6 。请返回你可以得到的最大数字。示例 1:输入:num = 9669输出:9969解释:改变第一位数字可以得到 6669 。改变第二位数字可以得到 9969 。改变第三位数字可以得到 9699 。改变第四位数字可以得到 9666 。其中最大的数字...原创 2020-03-04 23:34:55 · 966 阅读 · 0 评论 -
算法练习--寻找重复数
题目:给定一个包含n + 1 个整数的数组nums,其数字都在 1 到 n之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 :输入: [1,3,4,2,2]输出: 2代码一:排序法class Solution { public int findDuplicate(int[] nums) { A...原创 2020-03-02 23:52:39 · 652 阅读 · 0 评论 -
算法练习--移除元素
题目:给定一个数组 nums和一个值 val,你需要原地移除所有数值等于val的元素,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 :给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums ...原创 2020-03-02 23:41:13 · 203 阅读 · 0 评论 -
算法练习--移动零
题目:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。个人思路:使用双指针算法,定义左右指针,左指针指明放的位置,它前面是无0的,右指针进行遍历,判断不为0的数,将其放到左指针的位置,最后只...原创 2020-03-01 22:11:54 · 238 阅读 · 0 评论 -
算法练习--最小差
题目:给定两个整数数组a和b,计算具有最小差绝对值的一对数值(每个数组中取一个值),并返回该对数值的差示例:输入:{1, 3, 15, 11, 2}, {23, 127, 235, 19, 8}输出: 3,即数值对(11, 8)个人思路:使用双指针算法,如果将两个数组排序,那么题目会变成找出递增数组的最小差,然后只需从两个数组的头开始做差,然后让小的那个增加到下一位,继续做差...原创 2020-03-01 21:52:57 · 1103 阅读 · 0 评论 -
算法练习--救生艇
题目:第i个人的体重为people[i],每艘船可以承载的最大重量为limit。每艘船最多可同时载两人,但条件是这些人的重量之和最多为limit。返回载到每一个人所需的最小船数。(保证每个人都能被船载)。示例 :输入:people = [1,2], limit = 3输出:1解释:1 艘船载 (1, 2)个人思路:使用双指针算法,将数组排序,那么问题就变成两数之和...原创 2020-03-01 21:42:35 · 329 阅读 · 0 评论 -
算法练习--长度最小的子数组
题目:给定一个含有n个正整数的数组和一个正整数s ,找出该数组中满足其和≥ s的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。示例:输入: s = 7, nums = [2,3,1,2,4,3]输出: 2解释: 子数组[4,3]是该条件下的长度最小的连续子数组。代码:class Solution { public int min...原创 2020-02-27 00:26:03 · 176 阅读 · 0 评论 -
算法练习--最小覆盖子串
题目:给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。示例:输入: S = "ADOBECODEBANC", T = "ABC"输出: "BANC"说明:如果 S 中不存这样的子串,则返回空字符串 ""。如果 S 中存在这样的子串,我们保证它是唯一的答案。代码:使用滑动窗口实现class Solution { ...原创 2020-02-27 00:23:06 · 218 阅读 · 0 评论 -
算法练习-- 自定义字符串排序
题目:字符串S和 T 只包含小写字符。在S中,所有字符只会出现一次。S 已经根据某种规则进行了排序。我们要根据S中的字符顺序对T进行排序。更具体地说,如果S中x在y之前出现,那么返回的字符串中x也应出现在y之前。返回任意一种符合条件的字符串T。示例:输入:S = "cba"T = "abcd"输出: "cbad"解释:S中出现了字符 "a", "b", "c", 所以 "a"...原创 2020-02-24 14:59:14 · 398 阅读 · 0 评论 -
算法练习--单词距离
题目:有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?示例:输入:words = ["I","am","a","student","from","a","university","in","a","city"], word1 = "a", word2 = "stu...原创 2020-02-23 20:14:09 · 5292 阅读 · 2 评论 -
数据库习题--有趣的电影
题目:某城市开了一家新的电影院,吸引了很多人过来看电影。该电影院特别注意用户体验,专门有个 LED显示板做电影推荐,上面公布着影评和相关电影描述。作为该电影院的信息部主管,您需要编写一个 SQL查询,找出所有影片描述为非boring(不无聊)的并且 id 为奇数的影片,结果请按等级 rating 排列。例如,下表 cinema:+---------+-----------+...原创 2020-02-22 00:59:34 · 627 阅读 · 0 评论 -
算法练习--左旋转字符串
题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 1:输入: s = "abcdefg", k = 2输出:"cdefgab"限制:1 <= k < s.length <= 10000代码:...原创 2020-02-22 00:57:46 · 132 阅读 · 0 评论