
算法
文章平均质量分 81
卜大爷
鹅厂客户端开发负责人,T11级,鹅厂通道评委
展开
-
有效的括号(力扣:20)
有效的括号(力扣:20)题目给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true示例 3:输入: “(]”输出: false示例 4:输入: “([)]”输出: false示例&nbs原创 2020-11-28 17:33:11 · 22967 阅读 · 0 评论 -
整理字符串(力扣:1544)
整理字符串(力扣:1544)题目给你一个由大小写英文字母组成的字符串 s 。一个整理好的字符串中,两个相邻字符 s[i] 和 s[i+1],其中 0<= i <= s.length-2 ,要满足如下条件:若 s[i] 是小写字符,则 s[i+1] 不可以是相同的大写字符。若 s[i] 是大写字符,则 s[i+1] 不可以是相同的小写字符。请你将字符串整理好,每次你都可以从字符串中选出满足上述条件的 两个相邻 字符并删除,直到字符串整理好为止。请返回整理好的 字符串 。题目保证在给原创 2020-11-28 17:32:31 · 23076 阅读 · 0 评论 -
比较含退格的字符串(Java实现)
比较含退格的字符串题目比较含退格的字符串(力扣:844)给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。注意:如果对空文本输入退格字符,文本继续为空。示例 1:输入:S = “ab#c”, T = “ad#c”输出:true解释:S 和 T 都会变成 “ac”。示例 2:输入:S = “ab##”, T = “c#d#”输出:true解释:S 和 T 都会变成 “”。示例 3:输入:S = “a##c”, T原创 2020-11-21 16:42:42 · 23189 阅读 · 0 评论 -
栈的最小值(Java实现)
栈的最小值题目请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.getMin(); --> 返回 -3.minStack.pop();minStack.top();原创 2020-11-21 15:41:43 · 23266 阅读 · 0 评论 -
用栈操作构建数组(力扣:1441)
用栈操作构建数组题目给你一个目标数组 target 和一个整数 n。每次迭代,需要从 list = {1,2,3…, n} 中依序读取一个数字。请使用下述操作来构建目标数组 target :Push:从 list 中读取一个新元素, 并将其推入数组中。Pop:删除数组中的最后一个元素。如果目标数组构建完成,就停止读取更多元素。题目数据保证目标数组严格递增,并且只包含 1 到 n 之间的数字。请返回构建目标数组所用的操作序列。题目数据保证答案是唯一的。示例 1:输入:tar原创 2020-11-21 15:41:02 · 23034 阅读 · 0 评论 -
棒球比赛(Java实现)
棒球比赛题目棒球比赛(力扣:682)你现在是一场采特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:整数 x - 表示本回合新获得分数 x“+” - 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。“D” - 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记原创 2020-11-14 16:41:42 · 23093 阅读 · 0 评论 -
化栈为队(Java实现)
化栈为队题目面试题 03.04. 化栈为队实现一个MyQueue类,该类用两个栈来实现一个队列。示例:MyQueue queue = new MyQueue();queue.push(1);queue.push(2);queue.peek(); // 返回 1queue.pop(); // 返回 1queue.empty(); // 返回 false分析该题的思路和《用两个栈实现队列(Java实现)》一样。不过这里要注意一点,可以在pop()的时候,复用peek的逻辑。代码原创 2020-11-14 15:51:51 · 22961 阅读 · 0 评论 -
用两个栈实现队列(Java实现)
用两个栈实现队列题目剑指 Offer 09. 用两个栈实现队列用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )分析想要用栈实现队列。我们先来回忆一下栈和队列的区别:栈的特点是先进后出。队列的特点是先进先出。怎么能让先进后出的队列,来管理先进先出的数据呢?答案是再增加一个队列,先进后出2次,数据就变为了先原创 2020-11-14 15:37:38 · 23789 阅读 · 0 评论 -
删除字符串中的所有相邻重复项(Java实现)
删除字符串中的所有相邻重复项题目删除字符串中的所有相邻重复项(力扣:1047)给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。示例:输入:“abbaca”输出:“ca”解释:例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又原创 2020-11-08 18:06:40 · 24453 阅读 · 0 评论 -
去掉最低工资和最高工资后的工资平均值(Java实现2种算法)
去掉最低工资和最高工资后的工资平均值题目去掉最低工资和最高工资后的工资平均值(力扣:1491)给你一个整数数组 salary ,数组里每个数都是 唯一 的,其中 salary[i] 是第 i 个员工的工资。请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。示例 1:输入:salary = [4000,3000,1000,2000]输出:2500.00000解释:最低工资和最高工资分别是 1000 和 4000 。去掉最低原创 2020-11-08 17:29:44 · 23880 阅读 · 0 评论 -
根据数字二进制下 1 的数目排序(Java实现 击败100%)
根据数字二进制下 1 的数目排序题目力扣:1356给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。请你返回排序后的数组。示例 1:输入:arr = [0,1,2,3,4,5,6,7,8]输出:[0,1,2,4,8,3,5,6,7]解释:[0] 是唯一一个有 0 个 1 的数。[1,2,4,8] 都有 1 个 1 。[3,5,6]原创 2020-10-26 23:40:59 · 23083 阅读 · 0 评论 -
上升下降字符串(Java 实现)
上升下降字符串题目给你一个字符串 s ,请你根据下面的算法重新构造字符串:从 s 中选出 最小 的字符,将它 接在 结果字符串的后面。从 s 剩余字符中选出 最小 的字符,且该字符比上一个添加的字符大,将它 接在 结果字符串后面。重复步骤 2 ,直到你没法从 s 中选择字符。从 s 中选出 最大 的字符,将它 接在 结果字符串的后面。从 s 剩余字符中选原创 2020-10-24 16:47:26 · 23066 阅读 · 0 评论 -
重新排列字符串(Java实现)
重新排列字符串题目重新排列字符串(力扣:1528)给你一个字符串 s 和一个 长度相同 的整数数组 indices 。请你重新排列字符串 s ,其中第 i 个字符需要移动到 indices[i] 指示的位置。返回重新排列后的字符串。提示:s.length == indices.length == n1 <= n <= 100s 仅包含小写英文字母。0 <= indices[i] < nindices 的所有的值都是唯一的(也就是说,indices 是原创 2020-10-24 15:18:06 · 25469 阅读 · 0 评论 -
排列硬币
排列硬币(力扣:441)你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。给定一个数字 n,找出可形成完整阶梯行的总行数。n 是一个非负整数,并且在32位有符号整型的范围内。原创 2020-07-09 14:37:35 · 22972 阅读 · 0 评论 -
猜数字大小
猜数字大小(力扣:374)我们正在玩一个猜数字游戏。 游戏规则如下:我从 1 到 n 选择一个数字。 你需要猜我选择了哪个数字。每次你猜错了,我会告诉你这个数字是大了还是小了。你调用一个预先定义好的接口 guess(int num),它会返回 3 个可能的结果(-1,1 或 0):```-1 : 我的数字比较小 1 : 我的数字比较大 0 : 恭喜!你猜对了!...原创 2020-07-09 14:36:10 · 23505 阅读 · 0 评论 -
第一个错误的版本
第一个错误的版本(力扣:278)你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数原创 2020-07-09 09:57:46 · 22865 阅读 · 0 评论 -
有效的字母异位词
有效的字母异位词(力扣:242)给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。原创 2020-07-09 09:56:14 · 22859 阅读 · 0 评论 -
用栈实现队列(Java实现)
用栈实现队列(力扣:232)原创 2020-07-08 08:27:10 · 23823 阅读 · 0 评论 -
最大子序和
最大子序和(力扣:53)给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。原创 2020-07-08 08:25:21 · 22830 阅读 · 0 评论 -
搜索插入位置(Java 2种算法实现)
搜索插入位置(力扣:35)给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。原创 2020-07-07 09:49:34 · 23290 阅读 · 0 评论 -
验证回文串
验证回文串(力扣:125)给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。原创 2020-07-01 14:44:11 · 22897 阅读 · 0 评论 -
合并两个有序数组(Java原址实现)
合并两个有序数组(力扣:88)给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。原创 2020-07-01 14:43:03 · 23939 阅读 · 0 评论 -
删除排序数组中的重复项
删除排序数组中的重复项(力扣:26)给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。原创 2020-07-01 14:41:46 · 22899 阅读 · 0 评论 -
移除元素(Java算法实现)
移除元素(力扣:27)给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。原创 2020-07-01 10:37:44 · 23275 阅读 · 0 评论 -
移动零(Java的2种算法实现)
2种算法实现移动0的数组。移动零(力扣:283)给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。原创 2020-07-01 10:15:10 · 24353 阅读 · 0 评论 -
反转字符串(Java实现)
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。原创 2020-06-30 23:24:01 · 23325 阅读 · 0 评论 -
有序数组的平方
有序数组的平方(力扣:977)给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。原创 2020-06-30 23:04:56 · 23494 阅读 · 0 评论 -
两个数组的交集(Java的2种算法实现)
两个数组的交集(力扣:349)给定两个数组,编写一个函数来计算它们的交集。说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。原创 2020-06-30 23:03:36 · 32473 阅读 · 0 评论 -
两数之和 II - 输入有序数组(Java实现)
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。原创 2020-06-30 18:32:42 · 23241 阅读 · 0 评论 -
相交链表(Java 常规方法+最简单方法)
相交链表(力扣:160)编写一个程序,找到两个单链表相交的起始节点。原创 2020-06-30 17:45:05 · 23610 阅读 · 0 评论 -
二进制链表转整数
二进制链表转整数(力扣:1290)给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。请你返回该链表所表示数字的 十进制值 。原创 2020-06-30 17:43:10 · 23053 阅读 · 0 评论 -
第 N 个泰波那契数
第 N 个泰波那契数题目第 N 个泰波那契数(力扣:1137)泰波那契序列 Tn 定义如下:T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2给你整数 n,请返回第 n 个泰波那契数 Tn 的值。代码实现 /** * 1137. 第 N 个泰波那契数 * @param n * @return */ public原创 2020-06-29 07:14:54 · 22905 阅读 · 0 评论 -
从根到叶的二进制数之和
从根到叶的二进制数之力扣题目从根到叶的二进制数之和(力扣:1022 )给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。以 10^9 + 7原创 2020-06-29 07:14:06 · 22885 阅读 · 0 评论 -
二叉树中第二小的节点
二叉树中第二小的节点(力扣:671)给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。原创 2020-06-29 07:12:33 · 22913 阅读 · 0 评论 -
另一个树的子树
另一个树的子树(力扣:572)给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。原创 2020-06-29 07:10:01 · 22748 阅读 · 0 评论 -
将有序数组转换为二叉搜索树
将有序数组转换为二叉搜索树(力扣:108)将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。原创 2020-06-29 07:08:18 · 22962 阅读 · 0 评论 -
二叉搜索树中的众数
二叉搜索树中的众数(力扣:501)给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。原创 2020-06-29 07:06:53 · 28013 阅读 · 0 评论 -
递增顺序查找树
递增顺序查找树(力扣:897)给你一个树,请你 按中序遍历 重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。原创 2020-06-29 07:04:30 · 23089 阅读 · 0 评论 -
叶子相似的树
叶子相似的树题目叶子相似的树(力扣:872)请考虑一颗二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个叶值序列 。如果有两颗二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。如果给定的两个头结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。代码实现 /** * 872. 叶子相似的树 * @param root1 * @param原创 2020-06-29 06:58:51 · 22810 阅读 · 0 评论 -
二叉搜索树的最近公共祖先、二叉树的最近公共祖先
1. 二叉搜索树的最近公共祖先(力扣:235)2. 二叉树的最近公共祖先(力扣:236)原创 2020-06-29 06:56:36 · 24990 阅读 · 0 评论