Leetcode题目
Leetcode算法刷题记录
RRRRRGT
纸上得来终觉浅,绝知此事要躬行
展开
-
【数学】剑指Offer:孩子们的游戏
题目描述有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中从他的下一个小朋友开始,继续0...m-1报数直到剩下最后一个小朋友,可以不用表演请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)如果没有小朋友,请返回-1题目分析首先我们可以模拟整个过程,从而获得最后一个的编号只需要将孩子们存入一个List中,然后每次原创 2020-08-23 12:39:54 · 330 阅读 · 0 评论 -
【二叉树】剑指Offer:二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/题目分析首先最容易想到的,是用一个数组来存储中序遍原创 2020-08-21 22:26:48 · 169 阅读 · 0 评论 -
【位运算】剑指Offer:不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。题目分析不用加减乘除四则运算符号,那就只能通过逻辑操作来完成加法了,也就是通过位运算众所周知,计算机中整数时通过补码存的,如果是整数,那么原码=反码=补码;如果是负数,则补码=反码+1如果要通过位运算来操作,首先要将数字转换成二进制,然后再通过逻辑运算来完成加法运算一位加法也就是执行加法x ^ y;进位操作(x & y) << 1那二位加法呢?一次类推,原创 2020-08-16 11:03:00 · 162 阅读 · 0 评论 -
【贪心】剑指Offer:变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。题目分析一次可以上N个台阶,问上一个N级的台阶总共有多少种跳法。假设当前在第 N 级,那么有一下的跳法。如果上一步跳 1 步到达第 n 个台阶,说明上一步在第 n-1 个台阶。已知跳到第 n-1 个台阶的方法数为 f[n-1]如果上一步跳 2 步到达第 n 个台阶,说明上一步在第 n-2 个台阶。已知跳到第 n-2 个台阶的方法数为 f[n-2]…以此类推…如果上一步跳 n原创 2020-08-16 09:52:06 · 263 阅读 · 0 评论 -
【贪心法】Leetcode --- NO.665 非递减数列(Java)
题目描述题目分析当这个数组删去n个数后,呈现非递减的趋势,即每一个值都会比前一个值更大或相等解法分析循环判断当前值是否比前一个值更大或相等,否则就删去这个值,累计删除的次数,如果大于n就返回false这里的删去值不是真正的删去,如果真正删去还要重新排一次数组,可以用值来覆盖优先考虑令 nums[i - 1] = nums[i],因为如果修改 nums[i] = nums[i - 1] 的话,那么 nums[i] 这个数会变大,就有可能比 nums[i + 1] 大,从而影响了后续操作还原创 2020-07-29 14:34:42 · 211 阅读 · 0 评论 -
【贪心法】Leetcode --- NO.605 种花问题(Java)
题目描述题目分析种花的条件就是不能相邻种植,也就是说如果当前这个值为1,那左右两边的值都要为0,这样才符合条件解法分析对于每个数都要看左值和右值,如果是开头和结尾,就只需要看其中一个就行了代码class Solution { public boolean canPlaceFlowers(int[] flowerbed, int n) { int i = 0, count = 0; // 遍历数组 while (i < flo原创 2020-07-29 11:36:11 · 247 阅读 · 0 评论 -
【贪心法】Leetcode --- NO.406 根据身高重建队列(Java)
题目描述题目分析这道题就是将原本排好的队列在打乱后整理恢复原状第一个数h代表身高,第二个数k代表这个人之前有几个身高更高或相等的人数解法分析可以知道,k只跟身高更高的人相关,跟身高较矮的人没有关系所以可以先按照身高降序排序,如果身高相同就根据第二个数升序排序那这样排好序之后,逐个遍历,放到结果队列中因为身高已经是从高到低了,那么插入的时候主要是根据k如果k=2,就代表前面有两个更高的人,假设之前已经插入了n个人了,这n个人肯定都是比当前这个人更高的,那么直接插入到索引为2的位置即可原创 2020-07-29 10:10:46 · 232 阅读 · 0 评论 -
【贪心法】Leetcode --- NO.452 用最少数量的箭引爆气球(Java)
题目描述题目分析一支弓箭可以引爆有重叠部分的多个气球,求引爆所有气球所需要的最少的弓箭数量类似于求所有区间的最少重叠部分解法分析使用贪心法求解先对数组按照结束区间升序排序,然后逐个遍历气球如果这个气球的起始区间在当前这个弓箭引爆气球的区间的结束坐标之内,就不需要新增一个弓箭了否则就新增一支弓箭,并将这个气球的结束坐标定为这个弓箭的引爆气球的区间的结束坐标那么在这个坐标之内,气球都能够被已有的弓箭引爆假定现在有四个气球,红[2,8]、黄[7,12]、左绿[1,原创 2020-07-28 11:45:25 · 298 阅读 · 0 评论 -
【贪心法】Leetcode --- NO.435 无重叠区间(Java)
题目描述题目分析计算让一组区间不重叠所需要移除的区间个数的最小值反之就是计算最多能组成的不重叠区间个数的最大值,然后用总区间个数减去即可解法分析这道题是一个很经典的贪心算法问题 Interval Scheduling(区间调度问题)如果把一个区间表示这个时间段内要完成一个任务,那就类似于在一段时间内找到最大的完成任务数显然一个时间段内,一个人无法完成两件事,所以完成一个任务所用的时间越短,完成的任务越多那是每次选择完成用时最短的,还是开始最早的,还是其他的更优的呢?因为区间是固定原创 2020-07-28 10:55:41 · 233 阅读 · 0 评论 -
【DFS、BFS】Leetcode --- NO.104 二叉树的最大深度(Java)
题目描述题目分析题目非常简单,就是判断树的最大深度,可以使用深度优先算法或广度优先算法解法分析深度优先,递归遍历子结点,比较左子树和右子树的最大结点后 +1广度优先,使用队列,如果有子结点就将子结点放入队列中,然后弹出自身,循环操作直到队列为空代码深度优先/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; *原创 2020-07-28 10:11:17 · 221 阅读 · 0 评论 -
【贪心法】Leetcode --- NO.455 分发饼干(Java)
题目描述题目分析要满足尽量多的孩子,所以小饼干用来满足胃口小的孩子,大饼干用来满足胃口大的孩子因为胃口小的孩子更容易满足,所以可以优先给胃口小的孩子分配解法分析贪心法可以保证每次选择是最优的,但是无法保证对于全局来说是最优的那么先假设有一种算法比贪心法更优,如果假设不成立,那就说明没有算法比贪心法更好,也就是说贪心法是最优策略假设在某次选择中,贪心法选择给当前满足度最小的孩子分配第 m 个饼干,第 m 个饼干为可以满足该孩子的最小饼干。假设存在一种最优策略,可以给该孩子分配第 n原创 2020-07-27 12:07:42 · 224 阅读 · 0 评论 -
【动态规划】Leetcode --- NO.121 买卖股票的最佳时机(Java)
题目描述类似题目:122. 买卖股票的最佳时机 II题目分析根据题意,我们需要找出给定数组中两个数字之间的最大差值(即最大利润)并且第二个数字(卖出价格)必须大于第一个数字(买入价格)。解法分析双重遍历:找到每个点和后面的点的差值,取最大动态规划:前i天的最大收益 = max{前i-1天的最大收益,第i天的价格-前i-1天中的最小价格}代码class Solution { public int maxProfit(int[] prices) { //原创 2020-07-26 14:01:43 · 138 阅读 · 0 评论 -
【贪心算法】Leetcode --- NO.122 买卖股票的最佳时机 II(Java)
题目描述题目分析根据题意,为了获取最大利润,我们需要在上涨时买入,下跌时卖出如果是连续的上涨,上述规则也可满足最大利润,如下图中,D = A + B + C解法分析遍历,前后比较如果第二天比第一天小,那就是要下跌了,不要买入如果第二天比第一天大,那就是要上涨了,可以买入,并累计盈利代码class Solution { public int maxProfit(int[] prices) { int res = 0; int len =原创 2020-07-26 14:01:16 · 212 阅读 · 0 评论 -
【双指针】Leetcode --- NO.75 颜色分类(Java)
题目描述题目分析这道题给定得数组中只有 0 1 2 这三个数字,所以唯一要做的就是排序最直接的方法就是直接双重遍历排序可以使用多指针的方法,尽量一次遍历就完成排序可以使用两个个指针,分别指向 0 1 2 三个数字的交界处如果当前值是 0 就往头部放,如果是 2 就往尾部放,这样中间的值自然就是 1 了再用这两个指针和当前遍历的值进行判断,直到数组所有元素全部遍历一遍为止解法分析使用 while 循环,直到当前遍历的指针与指向 1 和 2的交界处 的指针相遇,表示已经排序完成如果当原创 2020-07-25 12:34:20 · 183 阅读 · 0 评论 -
【桶排序、堆排序】Leetcode --- NO.451 根据字符出现的频率排序(Java)
题目描述题目分析这道题就是找出每个字符出现的频率,然后根据频率来重组字符串频率多的放前面,频率少的放后面,频率一样先后顺序随便,但是要字母要放在一次跟 《Leetcode — NO.347 前K个高频元素》一样的解法解法分析首先要计算每个字符出现的频率,可以通过 Map 来存储字符和频率的对应关系因为最后要将频率出现的多的字符放在前面,那就要对频率做一个排序这里可以使用桶排序:第 i 个桶中出现的字符就说明出现了 i 次也使用堆排序,跟第 347 那道题大同小异代码桶排序原创 2020-07-25 11:49:09 · 250 阅读 · 0 评论 -
【桶排序、堆排序】Leetcode --- NO.347 前K个高频元素(Java)
题目描述题目分析这道题就是找出数组内出现频率前几的数组那么首先要计算数字出现的频率然后对频率进行排序,但是排序时不可打乱数字和频率的对应关系,找出前几大的数字解法分析累计数字出现的频率,这个可以通过map来累计,将数字当作键,将频率当作值因为最后要返回的是出现频率前几的数字数组,所以频率和数字不可以分开可以使用桶排序,第几个桶中存储的数据就出现了几次或者使用堆排序【官方题解】代码使用桶排序class Solution { public int[] topKFr原创 2020-07-25 10:27:55 · 252 阅读 · 0 评论 -
【动态规划法】Leetcode --- NO.64 最小路径和(Java)
题目描述题目分析最小路径和:即 起点到终点的所有路径的和的最小值每次只能 向右 或 向下 移动一步解法分析对于网格中的每一个点,到该点的最小路径为 到左边点的最小路径和到上边点的最小路径的最小值 加上 当前点的值使用动态规划法求路径数组代码动态规划法class Solution { public int minPathSum(int[][] grid) { if (grid == null || grid.length == 0 || grid[0]原创 2020-07-23 12:21:24 · 139 阅读 · 0 评论 -
【排序】Leetcode --- NO.215 数组中的第K个最大元素(Java)
题目描述题目分析这道题简而言之,就是将数组排序,然后取第K个大的值如果数组升序排序,就是取倒数第K个值如果数组降序排序,就是直接取第K个值即可《官方题解》解法分析这道题重点在数组排序可以直接使用Array.sort()来对数组进行排序,时间复杂度 O(NlogN),空间复杂度 O(1)堆排序:时间复杂度 O(NlogK),空间复杂度 O(K)快速选择:时间复杂度 O(N),空间复杂度 O(1)代码排序class Solution { publ原创 2020-07-22 12:07:16 · 189 阅读 · 0 评论 -
【二分法】Leetcode --- NO.154 寻找旋转排序数组中的最小值 II(Java)
题目描述这题是 第153题的延伸版本,点击查看题解题目分析这道题也是寻找排序数组的最小值,但是相比于 153 题,数组中多了可重复的元素这样就会带来一个问题,如果在比较的时候,两个值相等,那是忽略左区间好呢?还是忽略右区间好呢?来分析一下,如果两个元素相等,那就说明数组内含有相等的元素,由于重复元素的存在,就无法直接判断最小值是在中值的左还是右但是我们能够知道 右值 和 中值 是相等的如果 中值 在 最小值 的 左边 那 中值 的左边的值都是相等的,且等于 右值,移动原创 2020-07-22 11:25:13 · 194 阅读 · 0 评论 -
【双指针】Leetcode --- NO.153 寻找旋转排序数组中的最小值(Java)
题目描述题目分析给定的数组是一个已经在某个未知点经过旋转的的,且在旋转之前是排好序的数组那么这个数组就是有特性的:整个数组可以大致分为两块,左和右,以旋转点进行分割,可以得到两个升序排序的子数组且左数组的数字都会比右数组的数字要大,因为旋转之前是升序排序的题目要求最后获得数组中的最小值解法分析最暴力的方法就是全部遍历一遍,找到最小值,时间复杂度为O(N)因为数组已经是排好序的,我们可以用二分法寻找最小值,但是判断的条件会不一样现在假设左边的升序排序数组为 A ,右边的升序排原创 2020-07-22 10:45:16 · 190 阅读 · 0 评论 -
【双指针】Leetcode --- NO.524 通过删除字母匹配到字典里最长单词(Java)
题目描述题目分析这道题本质上就是查找最长子序列在给定的字符串字典集合中查找给定字符串的子序列,且要求为最长的,字典顺序最小的解法分析可以参考《官方题解》,方法较多,这里着重介绍双指针法双指针应用在判断某字符串是否是另外一个字符串的子序列上代码class Solution { public String findLongestWord(String s, List<String> d) { String res = ""; for(原创 2020-07-21 23:12:54 · 204 阅读 · 0 评论 -
【双指针】Leetcode --- NO.141 环形链表(Java)
题目描述/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { public boolean hasCycle(ListNode h原创 2020-07-21 22:25:19 · 174 阅读 · 0 评论 -
【双指针】Leetcode --- NO.88 合并两个有序数组(Java)
题目描述题目分析将两个有序数组合并到其中的一个数组两个数组,肯定就需要两个指针去遍历,然后比较大小,合并两个数组解法分析如果从头开始遍历,就会导致合并的时候有值会被覆盖可以从尾部开始遍历合并,这样就不会导致有数组的值会被覆盖代码class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { // 两个数组的遍历指针,从尾部开始 int index1 =原创 2020-07-21 20:27:44 · 205 阅读 · 0 评论 -
【双指针】Leetcode --- NO.680 验证回文字符串 Ⅱ(Java)
题目描述题目分析给定一个非空字符串,所以不用判空如果单单是验证回文字符串,那就是非常简单了,难点就在于要判断最多删除一个字符后是否能成为回文字符串解法分析根据题意,如果字符串为abca,那么在删除c后,仍然能构成回文字符串,则返回TRUE那么对应的就是当头指针和尾指针指向的字符不等时,当去掉其中一个字符后,继续判断剩下的是否仍构成回文字符串,且最多去掉一个字符那么前面已经判断过的,删掉一个字符后仍然是对称的,就不需要再回去判断了所以只需要删除头指针或尾指针的一个字符后,继续判断是否为原创 2020-07-21 18:33:32 · 191 阅读 · 0 评论 -
【双指针】Leetcode --- NO.345 反转字符串中的元首字母(Java)
题目描述题目分析元音字母,即 a e i o u以及大写字母A E I O U,所以需要创建一个数组存入这些字符,以供判断观察例子,发现是头和尾的两个元音字母进行交换,而不是相邻的两个,所以可以使用双指针解法分析两个指针,一个从头,一个从尾,如果两个都指向了元音字母,就交换值代码class Solution { public String reverseVowels(String s) { // 判空 if (s==null) return原创 2020-07-20 14:10:22 · 221 阅读 · 0 评论 -
【双指针】Leetcode --- NO.633 平方数之和(Java)
题目描述题目分析这道题跟两数之和异曲同工,关键在于如何取尾指针的数因为平方数中,只有 02 是最小的,仍为0,假定头指针的数为0 ,那么尾指针最大的数即为 target的开方,这个可以使用Math.sqrt()来计算确定了尾指针的值过后,就跟两数之和的解法是一样的了解法分析因为题目中没有提到 a2 不能和 b2 相等,所以这里的头指针和尾指针是可以重合的仍然使用while循环,直到两个指针相遇代码class Solution { public boolean judgeS原创 2020-07-19 11:40:10 · 172 阅读 · 0 评论 -
【双指针】Leetcode --- NO.167 两数之和(Java)
题目描述题目分析给定的数组时顺序排列的使用暴力法,双重循环,逐个相加,直到相等就退出循环返回结果使用双指针法,一个从头部开始移动,一个从尾部开始移动;核心思想就是:当两个指针指向的值相加的和大于目标值时,尾部指针前移,让和变小,当两个指针相加的值相加的和小于目标值时,头部指针后移,让和变大。解法分析使用while循环,直到头指针和尾指针相遇,若仍没有相等,则返回空结果代码class Solution { public int[] twoSum(int[] numbers,原创 2020-07-19 11:25:21 · 339 阅读 · 0 评论 -
Leetcode --- NO.58 最后一个单词的长度(Java)
题目描述题目分析简单来说,就是找出字符串的最后一个单词的长度,字符串使用空格作为分隔符换一个角度,如果说找出字符串第一个单词的长度,也许很多人就知道怎么解了:从第一个非空格的字符串开始计算,直到遇到第一个空格为止那么最后一个单词的长度,其实就是从尾部开始的第一个单词的长度,就可以使用尾部遍历法解法分析从尾部开始遍历,如果当前字符不是空格,计数器加一;如果是空格,并且count 不为0(表示已经为一个单词计数过,且碰到了第一个空格),就直接返回计数器的值代码class Solutio原创 2020-07-19 09:41:02 · 195 阅读 · 0 评论 -
Leetcode --- NO.53 最大子序和(Java)
题目描述题目分析需要遍历数组,根据前面的和来判断是否为最大和解法分析贪心法:如果前面的和大于0,那就说明前面的和是具有增益的,那就保留这个和并加上当前的数字;否则就表示说明总和对结果无增益效果,需要舍弃掉,那么就重置总和为当前的数字。动态规划法:如果前一个数字大于0,就加上前一个数字,到最后获取最大值代码贪心法class Solution { public int maxSubArray(int[] nums) { // 贪心法 if (原创 2020-07-18 09:57:04 · 161 阅读 · 0 评论 -
Leetcode --- NO.38 外观数列(Java)
题目描述题目分析简单来说,就是分析之前要生成相对应的字符串,然后再做统计,继续生成字符串,显而易见,需要用到递归解法分析整个步骤有两步,第一步生成上一层的字符串,第二步统计上一层字符串生成可以使用递归逐级生成统计需要遍历,大致的步骤为,判断下一个是否与前一个相等,如果相等就继续看下一个,不等就将字符个数和字符放到结果字符串中,也就是使用双指针法这里推荐使用StringBuffer而不要直接使用字符串拼接,可以提高效率,参看《String、StringBuffer和StringBuil原创 2020-07-17 10:30:11 · 174 阅读 · 0 评论 -
Leetcode --- NO.785 判断二分图(Java)
题目描述题目分析给定的数组的意思就是,对于示例一,就是说graph[0]有两个边,一个是0-1,一个是0-3;graph[1]的两个边就是1-0和1-2题目最后的注意表明graph[i]不会包含i或者是重复值,且数组是对称的以矩阵的形式表示示例一中的graph数组01230√√1√√2√√3√√以矩阵的形式表示示例二中的graph数组01230√√√1√√原创 2020-07-16 15:23:41 · 146 阅读 · 0 评论 -
Leetcode --- NO.35 搜索插入位置(Java)
题目描述题目分析这道题就是找位置,如果有相同的元素就返回元素索引值,如果没有相同的元素就返回插入的位置给定的数组是排好序的,所以只需要判断大小即可解法分析循环遍历字符串,然后比较大小,如果给定的值比数组当前的值要大则继续前进,如果是小于或等于则直接返回索引值即可因为是排好序的,所以一旦给定的值比当前遍历的值要小,就说明这里是顺序插入的地方如果遍历完字符串仍然没有找到插入位置,那就直接放在数组的最后代码class Solution { public int searchIn原创 2020-07-16 10:50:38 · 177 阅读 · 0 评论 -
Leetcode --- NO.28 实现strStr()(Java)
题目描述题目分析三种情况,找到、未找到、给定的字符串为空,分别对应的返回结果是:返回第一个字符的索引值、返回-1,返回0难点在于如何匹配字符串解法分析两个字符串双重嵌套循环,暴力解法,效率不高双指针解法,本质跟上面的解法是一样的,循环遍历两个字符串KMP算法或其他字符串匹配算法代码暴力解法改进版,使用equals方法class Solution { public int strStr(String haystack, String needle) {原创 2020-07-15 19:26:10 · 158 阅读 · 0 评论 -
Leetcode --- NO.27 移除元素(Java)
题目描述题目分析这道题就是要将给定的数组内的某个指定元素删除掉,然后返回删除某个指定元素之后的新数组长度而且只能在原数组进行改动,不能创建新的数组解法分析逐个判断,如果跟指定的元素相等,就删除该元素删除时可以采用元素左移(适用于数组元素较少时),也可以用双指针法(一个指向遍历的元素,一个指向当前要被覆盖的元素位置)代码双指针class Solution { public int removeElement(int[] nums, int val) {原创 2020-07-15 14:40:04 · 186 阅读 · 0 评论 -
Leetcode --- NO.26 删除排序数组中的重复项(Java)
题目描述题目分析根据说明中的条目,且题目要求在原地进行修改可知,操作数组的过程可以直接在数组内部操作,且返回的长度即要输出的数组范围换成人话说,最后处理完成的结果就是数组的前面部分就是无重复项的数组内容,其余后面的不用管给出的数组是排好序的解法分析 — 双游标法分析可知,这道题只能在原数组上进行操作,那么就需要用到游标了,一个用来遍历数组,一个用来保存结果假设 i用来遍历,j用来保存结果,那么就是先遍历,判断两个游标指向的值是否相等,如果不等则赋值给j,如果相等,则i继续前进代码原创 2020-07-13 10:20:53 · 178 阅读 · 0 评论 -
Leetcode --- NO.350 两个数组的交集(Java)
题目描述题目分析将两个数组中公共部分的值形成一个新数组并返回题目中的进阶,给了一定的提示,可以先对数组进行排序如果一个数组比另外一个数组大很多,这又该怎么办数组如果不能一次性全部加载进内存又该怎么办解法分析排序的作用:在遍历判断的时候,如果当前比较的两个数组的数字不一样大时,较小的那个数组往下一个值移动比较即可,因为数组已经排好序了,如果当前的数字较小,那么之前的数字肯定也不能相等;针对两个数组大小差异较大,我们可以采用两个尺度判断循环结束的条件,当一个数组已经遍历结束了,就可以退出原创 2020-07-13 09:57:23 · 272 阅读 · 0 评论 -
Leetcode --- NO.21 合并两个有序链表(Java)
题目描述/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; }原创 2020-07-12 10:59:18 · 162 阅读 · 0 评论 -
Leetcode --- NO.20 有效的括号(Java)
题目描述题目分析这道题相信接触过数据结构的人都知道怎么做,只需要用到栈的特性即可解法分析先初始化一个栈,然后逐个字符判断,如果是左边的就入栈,如果是右边则出栈,判断是否匹配即可判断匹配有两种选择,一个是左边入栈时压入右边,出栈判断相等即可,一个是入栈时压入左边,然后出栈时判断是否等于当前字符的对应左边上代码使用Java的Stack类class Solution { public boolean isValid(String s) { if(s == nu原创 2020-07-12 10:04:11 · 167 阅读 · 0 评论 -
Leetcode --- NO.14 最长公共前缀(Java)
题目描述class Solution { public String longestCommonPrefix(String[] strs) { }}题目分析根据题目可知:给定一个字符串数组,找出数组内所有字符串的公共前缀什么叫前缀?即从第一个字符开始就要相等,如果都没有,则返回空字符串解法分析解法一:比较原始的方法,遍历字符串,然后两两比较获得公共部分,再用公共部分去与下一个字符串对比,直到最后。解法二:先将字符串按字典顺序排序,排序后只需要对比第一个和最后一个字原创 2020-07-11 11:53:37 · 288 阅读 · 0 评论 -
Leetcode --- NO.13 罗马数字转整数(Java)
题目描述class Solution { public int romanToInt(String s) { }}题目分析读完题目可知,系统给定一个罗马数字的字符串,然后根据这个字符串进行解析转换成整数罗马的多种字符与数字的对应关系可以用Map存储或者用条件分支语句判断给值,主要用于表示对应关系然后根据给定的字符串按位分析但是有一个比较不同寻常的地方,例如IV表示4而不是6其实也就是说一般情况下小的数字在大的数字的右边,如果小的数字在大的数字的左边原创 2020-07-10 10:35:47 · 239 阅读 · 0 评论