扑克牌中的顺子
剑指 Offer 61. 扑克牌中的顺子题目说明从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
数组长度为 5
数组的数取值为 [0, 13] .
示例例112输入: [1,2,3,4,5]输出: True
例212输入: [0,0,1,2,5]输出: True
笔者理解此题是一道算法问题。
解法当笔者阅读完此题后,发现此题是一道挺有意思的题目,读者们遍历一下扑克的分发可能情况就不难发现,有无大小王都可以算在一个情况里面,即发放的牌中的最大值和最小值的差值要小于5(不计算大小王及排除重复牌),一旦重复发放一张牌就构不成5张顺子了,而除去重复牌和是否有大小王的情况下,我们只需要讨论剩下牌即可。
让我们来看看具体如何实现的吧。
实现1234567891011121314151617181920212223public boolean isStraight(int[] nums) { Set <Intege ...
验证二叉树的前序序列化
力扣 331. 验证二叉树的前序序列化题目说明序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #。
1234567 _9_ / \ 3 2 / \ / \ 4 1 # 6/ \ / \ / \# # # # # #
例如,上面的二叉树可以被序列化为字符串 "9,3,4,#,#,1,#,#,2,#,6,#,#",其中 # 代表一个空节点。
给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。
每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 '#' 。
你可以认为输入格式总是有效的,例如它永远不会包含两个连续的逗号,比如 "1,,3" 。
示例例112输入: "9,3,4,#,#,1,#,#,2,#,6,#,#"输出: true
例212输入: "1,#"输出: ...
基本计算器II
力扣 227. 基本计算器 II题目说明给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
1 <= s.length <= 3 * 105
s 由整数和算符 ('+', '-', '*', '/') 组成,中间由一些空格隔开
s 表示一个 有效表达式
表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
题目数据保证答案是一个 32-bit 整数
示例例112输入:s = "3+2*2"输出:7
例212输入:s = " 3/2 "输出:1
示例 3:
12输入:s = " 3+5 / 2 "输出:5
笔者理解此题是一道字符串算法问题,在力扣题库中被定义为中等题。
解法当笔者阅读完此题后,发现此题运用栈比较合适,当我们遍历到一个数时,就将其插入栈中(需要注意的是此题中可以会出现大于9的数,也就是不止一位数),然后因为此题只有四则运算,所以遇见乘除直接运算(将当前 ...
排序数组
例题 排序数组题目说明给你一个整数数组 nums,请你将该数组升序排列。
1 <= nums.length <= 50000
-50000 <= nums[i] <= 50000
示例例112输入:nums = [5,2,3,1]输出:[1,2,3,5]
例212输入:nums = [5,1,1,2,0,0]输出:[0,0,1,1,2,5]
笔者理解此题是一道经典的排序问题。
解法本次我们用经典八大排序算法中的选择排序来做这个题,选择排序的原理就是每次遍历一遍数组,挑选出相较最小的一个数,然后交换到前面去,前面已经排好序的元素不受后面的影响,所以实际上他需要比较的次数就是1+2+3+…+(n-1),也就是*[n(n+1)]/2,但是他需要交换元素的次数最坏的情况为n-1**,所以选择排序适合元素交换代价较大的问题。
实现12345678910111213141516171819202122232425262728public int[] sortArray(int[] nums) { int n = nums.length; ...
删除字符串中的所有相邻重复项
力扣 1047. 删除字符串中的所有相邻重复项题目说明给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
1 <= S.length <= 20000
S 仅由小写英文字母组成。
示例例11234输入:"abbaca"输出:"ca"解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
笔者理解此题是一道字符串算法问题,在力扣题库中被定义为简单题。
解法当笔者阅读完此题后,发现此题很适合用栈,然后将字符串各个字母存进栈中,相同的就弹出来,输出最后留在栈中的字母即可,但后来发现这样的时间和空间效率都不高,在 ...
买卖股票的最佳时机II
力扣 122. 买卖股票的最佳时机 II题目说明给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
1 <= prices.length <= 3 * 10 ^ 4
0 <= prices[i] <= 10 ^ 4
示例例11234输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
例212345输入: [1,2,3,4,5]输出: 4解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 注意你不能在第 1 天 ...
删除排序数组中的重复项
力扣 26. 删除排序数组中的重复项题目说明给定一个排序数组,你需要在** 原地** 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
12345678// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝int len = removeDuplicates(nums);// 在函数里修改输入数组对于调用者是可见的。// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。for (int i = 0; i < len; i++) { print(nums[i]);}
示例例112345给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度 ...
Pow(x, n)
50. Pow(x, n)题目说明实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,x^n)。
-100.0 < x < 100.0
-2^31 <= n <= 2^31-1
-10^4 <= x^n <= 10^4
示例例112输入:x = 2.00000, n = 10输出:1024.00000
例212输入:x = 2.10000, n = 3输出:9.26100
例3123输入:x = 2.00000, n = -2输出:0.25000解释:2^-2 = 1/22 = 1/4 = 0.25
笔者理解此题是一道数学算法问题,在力扣题库中被定义为中等题。
解法此题中,直接暴力运算很明显是行不通的,很容易浪费大量的时间和空间,在此,我们可以把指数进行拆分,将其转化为二进制数的形式,然后用底数累乘的方式来进行计算。让我们来看看具体如何实现的吧。
实现12345678910111213141516171819202122232425262728class Solution { public double ...
下一个更大元素II
力扣 503. 下一个更大元素 II题目说明给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。
输入数组的长度不会超过 10000。
示例例112345输入: [1,2,1]输出: [2,-1,2]解释: 第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更大的数; 第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
例212输入: [5,4,3,2,1]输出: [-1,5,5,5,5]
笔者理解此题是一道数组算法问题,在力扣题库中被定义为中等题。
解法当笔者阅读完此题后,发现此题运用栈比较合适,当我们遍历到一个数时,就将其插入栈中,如果当前元素比栈首元素要大时,我们将其视为一个组合,然后将栈首元素弹出。让我们来看看具体如何实现的吧。
实现12345678910111213141516171819202122public int[] nextGreaterEleme ...
不用加减乘除做加法
剑指 Offer 65. 不用加减乘除做加法题目说明写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
a, b 均可能是负数或 0
结果不会溢出 32 位整数
示例例112输入: a = 1, b = 1输出: 2
笔者理解此题是一道位运算问题。
解法当笔者阅读完此题后,发现此题是一道经典的位运算题,不用运算符进行加法运算,我们可以通过异或和相与进位来计算,
例如:10011和10001,异或得到00010,相与进位得到100010,递归进行运算,得出结果。
让我们来看看具体如何实现的吧。
实现12345678public int add(int a, int b) { if(a==0){ return b;} if(b==0){ return a;} //如果a或者b为0,相加结果就是另一个树 return add(a^b,(a&b)<<1); //a^b代表两个数二进制的相加(还没有 ...








