
leetcode
文章平均质量分 62
pusude
这个作者很懒,什么都没留下…
展开
-
leetcode(1)1.Two Sum
题意理解:给一个数组和一个整数,数组中有且仅有两个数的和是给出的整数,要求返回这两个数的角标。思路:最初的思路不外乎是两重循环,全部遍历。那么有没有可以优化的呢?我想的是,其一 查找判断的时候,已经找过的不用再找了,其二,我们找到以后不用再找了。对于第一点我们二重循环从j = i+1 开始,而不是 j=0,避免重复查找,对于第二点,我们可以设置flag,退出循环,也可以找到后直接退出函数。原创 2016-10-06 19:38:19 · 358 阅读 · 0 评论 -
leetcode(2)6. ZigZag Conversion
题意理解:题目给出一个字符串和一个整数,如果将这个字符串列成之字形,那么按照从上到下再从左到右的顺序排列出来,对这个排列好的字符串,再重新按照从左到右再从上到下的顺序排列出来,得到一个新的字符串,返回它。例如给出:1 52 4 6 83 7 返回:15246837思路分析:1.我首先的想法,这个图形有变化和不变化的部分,需要把原创 2016-10-07 10:15:15 · 243 阅读 · 0 评论 -
leetcode(3)7.Reverse Integer
这道题是要反转整数。除了核心的思路要考虑之外,一些细节比如前后0,溢出等等问题。我初步的思路是循环的除10,取得每一位数,放入可变数组中,再取出做循环的乘10运算。现在是两个循环,思路优化:能不能把两个操作都放在一个循环里呢?好像是可以的,来。我们必然可以肯定的就是,我们得到的数的顺序一定是从原来数的个位到最高位通过循环的:result = x % 10;x = x /原创 2016-10-31 20:45:31 · 223 阅读 · 0 评论 -
leetcode(4)8.String to Integer (atoi)
这是一个字符串处理的题题意大致是:要将一个字符串转化成数值,这是很简单的。但是,第一个,有相应的正负,第二个有可能超出整数范围,根据正超出或者负超出,返回整数正最大值或者整数负最小值,如果字符串的前面有空格,那么忽略,直到数字或者正负号才处理,最后根据正负号返回相应的数值。我们来思索思索:首先string转化成一个char[] 来处理,其次,要得到数值很简单,字符相减就可以了。同时我们原创 2016-10-31 21:21:53 · 303 阅读 · 0 评论 -
leetcode(81).345. Reverse Vowels of a String
题意:给定一个字符串,反转其中的元音字符(其它字符位置不变)初步分析:这个题的思路还是很简单的。两个指针前后遍历,每次都各自先走到要交换的元素上,每交换以后,各自再朝中间走一步public class Solution { public String reverseVowels(String s) { if(s == null || s.length原创 2016-11-28 19:16:41 · 189 阅读 · 0 评论 -
leetcode(82).349. Intersection of Two Arrays
题意:给两个数组,计算它们的交集,交集中元素都只出现一次。初步分析:想了下,还是得两重循环,用map,先遍历一个,将元素装进map(只装一次)然后再遍历另一个,如果map有key,说明重复,也即是相交元素,但是这里不能放入数组,因为数组大小不确定,这里只是统计数量(设置value,使不重复放进去)最后第三步,遍历map,取出特定值的键(即相交元素)。public class原创 2016-11-28 20:03:33 · 249 阅读 · 0 评论 -
leetcode(83).350. Intersection of Two Arrays II
题意:返回给定两个数组的交集(所有匹配的元素,包括多次匹配的的)初步分析:还是用hashmap,只要将map的value理解为第一个数组中的个数,第二个数组每匹配掉一个,都将value减1,当value等于0的时候,就相当于已经匹配完了。我们是没有办法时候通过value值判断它到底匹配过没有,匹配过几次的,所以只能当场添加,所以使用动态数组。public class Solut原创 2016-11-28 20:17:37 · 242 阅读 · 0 评论 -
leetcode(84).374. Guess Number Higher or Lower
题意:猜数字,可调用guess方法,返回猜大了还是猜小了。现在给定n,找出系统猜的数字(在1-n之间猜)初步分析:这其实就是差不多二分差找了,只不过比大小的判断借助guess而已。我们这一把用下递归来实现二分差找。public class Solution extends GuessGame { public int guessNumber(int n) { r原创 2016-11-28 20:34:42 · 176 阅读 · 0 评论 -
leetcode(85).383. Ransom Note
题意:给定两个小写字母构成的字符串,判断前者是否能由后者字符串中的字母组成,而且每个出现在后者中的字母只能在前者中出现一次(一一匹配)。初步分析:就是说前者字符串中的所有字母后者字符串中都要有,而且数目还必须等于或者大于前者。用map存储前者每个字母有多少个,然后遍历后者,对于map中有的(前者字符串有的),就将map中value值减1最后如果不存在value值大于0的,返回真原创 2016-11-28 21:26:24 · 241 阅读 · 0 评论 -
leetcode(86).387. First Unique Character in a String
题意:给定一个小写字母构成的字符串。返回它第一个不重复字符(串中只有唯一一个)的索引初步分析:这个用map是比较好的,可惜它无序,所以用int当map用。public class Solution { public int firstUniqChar(String s) { int[] map = new int[26]; for(int i原创 2016-11-28 23:51:05 · 202 阅读 · 0 评论 -
leetcode(87).389. Find the Difference
题意:给定两个小写字母字符串,第二个字符串比第一个字符串多了一个字符,但是顺序可能打乱了。要求找出那个多出的字符。现在的条件是,多了一个,顺序不一定,我们要最大限度的利用这个条件,就要想办法忽略顺序,所以要想一个办法,忽略具体的顺序来找出那个位置不一定的字符。既然位置要忽略,就考虑从内容入手。所以采用总值相减的办法。public class Solution {public char原创 2016-11-29 19:52:52 · 240 阅读 · 0 评论 -
leetcode(88).404. Sum of Left Leaves
题意:给定一棵二叉树,返回所有左叶子值的和。初步分析:递归:除了节点以外还需要传递和的信息,后来还发现还需要传递判断是不是左结点的信息。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode r原创 2016-11-29 20:32:42 · 266 阅读 · 0 评论 -
leetcode(89).405. Convert a Number to Hexadecimal
题意:将一个整数转化成十六进制。初步分析:核心就是循环:不断除以16,取余数。1因为32位,可以使用long2 因为要一个个添加,可以使用StringBuilder3 对于a b c 可以使用一个char[] 做map代码:public class Solution { public String toHex(int num) { if原创 2016-11-29 21:11:35 · 219 阅读 · 0 评论 -
leetcode(90).412. Fizz Buzz
题意:给定一个n,返回一个字符串序列从1-n,就是对应数字的字符串,但是3的倍数是Fizz,5的倍数是Bizz,15的倍数是FizzBizz初步分析:这题没什么意思,直接把题目意思翻译成程序语言即可。public class Solution { public List fizzBuzz(int n) { List list = new ArrayList<>()原创 2016-11-29 21:30:40 · 380 阅读 · 0 评论 -
leetcode(5)9. Palindrome Number
题意:判断一个整数是不是回文。思路1:不断取出整数的每一位,放入数组,再遍历数组,看对应位是否相等。这是最基础的思路,但是直觉上是不太好的。我们现在想一想有没有简单的办法.如果我们不去一位一位的比的话,那么直观的代替方法就是,整个反转比较。如果我们把int给反过来,看和原来的是不是相等,这个思路实现如何呢?我们只能不断取得最低位,但是把这个最低位做高位,所以,不断乘10,再加上新取得的原创 2016-11-18 16:16:47 · 164 阅读 · 0 评论 -
leetcode(6)13. Roman to Integer
题意:将一个罗马数字转为int罗马数字采用七个罗马字母作数字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3;小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12;小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大原创 2016-11-18 16:44:04 · 184 阅读 · 0 评论 -
leetcode(7).14. Longest Common Prefix
题意:找字符串数组的公共前缀字符串参数:string[] 返回 string思路:不断遍历循环所有的string,一位一位的比较,直到有不同为止,但是这样比不方便,所以,第一个string不参与循环,其他n-1个string循环,和第一个string的每一位比较。(string需要用toCharArray()变成字符数组)但是这种思路太复杂,显然是不好的,循环里面每个都还要比,实现起来原创 2016-11-19 10:55:48 · 221 阅读 · 0 评论 -
leetcode(8)19. Remove Nth Node From End of List
题意:给出一个链表和一个数,删除链表倒数那个数对应的结点。分析:这其实就是链表删除,链表只能顺序查找,删除的关键就是要找到找到结点的前一个结点和后一个结点。我们要让一个结点走到 length-n 的地方,要么就是知道这一段是多么长(length需要走完一遍测量出来),然后再从头结点走这么长。我们有没有办法不获得这个length - n 就走到那里呢?核心点要落在n身上。我们画图思考之后原创 2016-11-19 13:09:53 · 254 阅读 · 0 评论 -
leetcode(9).20. Valid Parentheses
题意:确定一个包含大中小括号的字符串的括号是否都以正确的顺序闭合。初步分析:1.这个在学数据结构的时候,是一个很经典的栈的应用。大概就是遇到左括号就放入栈中,遇到右括号,就从栈中弹出栈顶的元素,比较如果不等则代表匹配失败,结束。最后,要看栈是否为空,如果不为空,也是匹配失败的。所以,要想匹配成功,就需要每一次括号都和栈顶弹出的左括号匹配。而且最后栈为空。基本结构:while -原创 2016-11-20 10:29:40 · 325 阅读 · 0 评论 -
leetcode(10)21. Merge Two Sorted Lists
题意:对于两个已经排好序的链表,将它们合并成一个新链表初步分析:这好像也是学数据结构的时候,挺经典的一个题目。方法大概是遍历两个排好序的链表,一边走一边比,谁小插谁(新建一个链表往里插)。直到走到一条走完,然后如果剩下那条还没走完,接着走。现在再来考虑一下异常情况:想了一下,好像不用专门对异常处理,反正都是从头结点判断空,没有不走就是了。至于插入:要保持顺序,顺着插就可以了: c.next原创 2016-11-20 14:25:33 · 189 阅读 · 0 评论 -
leetcode(11)24. Swap Nodes in Pairs
题意:给一个链表,交换所有相邻的两个结点(在恒定的空间内)初步分析:一对一对的处理.再细细一想,这道题太有意思了,因为很有逻辑,我们来慢慢画图,慢慢思索。前提设定 :每个相邻的块: a -> b1 我们的循环中要描述的点:要交换的a,要交换的b ab前面那一个。 链表的实质其实就是一个个结点,而结点的实质就是前后两条线,把握一个关键,前面的可以描述后面的(因为有next属性嘛)原创 2016-11-20 16:23:13 · 361 阅读 · 0 评论 -
leetcode(12)26. Remove Duplicates from Sorted Array
题意:给一个排好序的新数组,删除重复的值,返回新的长度初步分析:因为只允许在给出的空间,所以只能够数组给自己赋值。我们用一个int型变量来作为游标,记录当前要进行比较的值。如果相同,那么继续往后遍历,游标不动,否则两者都加1,并且赋值。其实就是两个指针在走,在比较,一个是遍历,一个是只有不同的才走。脑子里好好想象下就清楚了。代码:public class Solution {原创 2016-11-20 17:26:43 · 181 阅读 · 0 评论 -
leetcode(13)27. Remove Element
题意:对指定的数组删除所有的指定的值。并返回新的长度。初步分析:因为必须在本数组上完成操作。所以在本数组上设立两个指针。两个指针,一个遍历旧数组,一个遍历新数组。旧数组的遍历值和给出的值比较,如果相同,略过。如果不同,赋值给新数组的指针,然后新数组指针才往后走。直接上手写代码:public class Solution { public int removeElem原创 2016-11-20 20:15:12 · 222 阅读 · 0 评论 -
leetcode(14).28. Implement strStr()
题意:两个string,找后一个在前一个出现的索引,如果没出现,返回-1初步分析:这个题吧,真是忍不住用string的api,indexOf直接ko,一层循环再加substring也可以解决,如果不用方法的话,应该是要两重循环的。public class Solution { public int strStr(String haystack, String needle) {原创 2016-11-21 00:01:18 · 201 阅读 · 0 评论 -
leetcode(15).36. Valid Sudoku
题意:对于一个九宫格,对九个格子每一个都再划分九宫格,总共81小格子。现在要满足规则:对整个格子区域每横有且仅有1-9,每列亦然。而对于每个一级九宫格里面的九个二级九宫格,有且仅有1-9(总共三条规则)。给出一个char[][]数组,判断是否可解。('.' 代表空格子)。初步分析:三个条件实质上其实就是不能重复,自然想到set这种集合,最大的特点就是元素不能重复。初步的思路是对原创 2016-11-21 11:32:24 · 241 阅读 · 0 评论 -
leetcode(16).38. Count and Say
题意:对于一个整数序列:1, 11, 21, 1211, 111221, ...第二个数是11是因为:第一个数是1-> 1个1 ->11第三个数是21是因为:第二个数是11 -> 2个1 ->21返回整数序列的第n个是什么初步分析:根据n,从零开始遍历到n,一个一个的生成。每一次都遍历上一次生成的字符串,如果相邻相同的时候,计数加1(相同的个数).最后每次循环结束:st原创 2016-11-21 13:45:20 · 222 阅读 · 0 评论 -
leetcode(17).58. Length of Last Word
题意:给出一个string,包含大小写字母和空格符。返回最后一个words的长度,如果不存在则返回0.初步分析:先排除字符串为空的情况,这就代表有单词了,然后,分两种情况,一种是最后的单词后面什么都没有,一种是后面有空字符。从后往前遍历即可。然后最后的空格读完了(如果有的话)截取一个点,最后的单词读完了,再截取一个点,相减得到相对距离即可。public class Solution {原创 2016-11-21 18:52:14 · 187 阅读 · 0 评论 -
leetcode(18).66. Plus One
题意:对一个数,这个数表示成一个数组,对这个数加上1,返回新数表示的新数组。初步分析:本来是个位加1就可以了,但是这个问题的关键在于,可能会有进位(当最后一位或最后几位为9的时候) 9 ->10。所以循环遍历并分类讨论。public class Solution { public int[] plusOne(int[] digits) { for(int i=d原创 2016-11-21 19:23:31 · 170 阅读 · 0 评论 -
leetcode(19).67. Add Binary
题意:给定两个二进制字符串,返回它们的二进制和字符串。0 + 0 = 00 + 1 = 11 + 0 = 11 + 1 = 10(进位)=> sum%2 是运算结果, sum/2是进位。加法就是 a = b + c (c是进位)所以:先找出哪一条更长,遍历长的。public class Solution { public String add原创 2016-11-21 20:00:53 · 237 阅读 · 0 评论 -
leetcode(20).70. Climbing Stairs
题意:到山顶有n步,每次可以走一步或者两步,问到山顶有多少种走法?初步分析:如果n=1的话,显然只有一种,如果n=2的话,显然只有两种,而对于大于二的n,到达这里的走法应该是n-2对应的走法加上n-1对应的走法。(这就是核心的非特殊的动态关系)public class Solution { public int climbStairs(int n) {原创 2016-11-21 20:44:45 · 183 阅读 · 0 评论 -
leetcode(21).83. Remove Duplicates from Sorted List
题意:给一个按值排好序的链表,删除其中的重复结点。初步分析:大概,遍历删除,就可以吧。。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */原创 2016-11-21 20:55:59 · 173 阅读 · 0 评论 -
leetcode(22).88. Merge Sorted Array
题意:给出两个有序数组nums1和nums2,初始化数分别为m,n。现在要合并两个数组,假定nums1足够大。初步分析:遍历两个数组,将nums2中大小合适的一批元素插入到nums1中。发现太麻烦,参考别人思路,总长度是固定的,所以,倒着来。代码:public class Solution { public void merge(int[] nums1, int m, i原创 2016-11-21 21:36:08 · 172 阅读 · 0 评论 -
leetcode(23).100. Same Tree
题意:检查两个二叉树是否相等。初步分析:深搜两棵树,比较之。(深搜可采用递归)只有左右子树都相同的时候才进入递归。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; *原创 2016-11-21 23:14:30 · 159 阅读 · 0 评论 -
leetcode(24).101. Symmetric Tree
题意:判断给定的二叉树是否中心对称。初步分析:递归判断。要判断左右子树是否想等,所以需要单独封装一个方法来递归调用/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; *原创 2016-11-21 23:45:30 · 185 阅读 · 0 评论 -
leetcode(25).102. Binary Tree Level Order Traversal
题意:给定二叉树,按层次遍历的顺序返回其值初步分析:用队列广度优先搜索。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val原创 2016-11-22 13:20:06 · 202 阅读 · 0 评论 -
leetcode(27).107. Binary Tree Level Order Traversal II
题意:给定一个二叉树,反序层次遍历其结点。(从左到右,从下到上)初步分析:从左到右是可以的,这没什么,从右到左都只需要调换入队顺序即可。关键是树结点从下到上是找不到的。所以直接从下到上找是不可能的。我们先假定从上到下从右到左的一层一层的搜索。每层返回一个list,这些list如果能反着装进List即可。那么先放入栈中,再取出。/** * Definition for a binary原创 2016-11-22 19:21:15 · 203 阅读 · 0 评论 -
leetcode(28).108. Convert Sorted Array to Binary Search Tree
题意:给定一个排好序的整数数组,将它转化为一个平衡的二叉排序树。初步分析:二叉排序树的左结点比父节点小,父节点比右结点小。又因为数组是已经排好序了的。所以,数组的中间的值应该是根节点,左边区间的中间值是根节点的左结点,右区间的中间值是根节点的右结点。很明显这是一个动态划分区间的过程,自然想到递归。递归的三要素:1参数:树结点,数组区间(区间左端点,区间右端点)原创 2016-11-22 20:39:48 · 170 阅读 · 0 评论 -
leetcode(29).109. Convert Sorted List to Binary Search Tree
题意:给出一个排好序的单链表,将它转化为平衡的二叉搜索树。初步分析:基于上一篇的考虑,我们现在来考虑递归,那么问题来了,我们对于一个数组区间的描述,需要数组本身,起点角标,终点角标。但是链表不是这样的,我们来思考!链表需要头结点(即表示了链表)和长度或者头结点和尾节点能充分完全的表示出一段链表。长度我们首先要知道链表的长度,所以需要先遍历,我们暂且不考虑,暂时用头结点和尾节点(原创 2016-11-22 21:19:24 · 216 阅读 · 0 评论 -
leetcode(30).110. Balanced Binary Tree
题意:判断给定的二叉树是否是平衡树。(平衡树是指树的子树结点高度差不超过一)初步分析:深度考虑深度优先搜索,采用递归的方式实现。再比较判断高度差是否超过1.我们可以把递归的部分设置为高度然后,现在我们可以获得子树的高度了,那么左子树和右子树的高度差不能超过1。然而,仅仅这样是错的。比如 * * * * *原创 2016-11-23 00:11:51 · 178 阅读 · 0 评论 -
leetcode(31).111. Minimum Depth of Binary Tree
题意:给定一个二叉树,查找其最小深度。初步分析:递归的获取到最小深度。(从上往下,左右子树深度相比,每次递归都取最小的那个再加1)public class Solution { public int minDepth(TreeNode root) { if(root == null) return 0; return Ma原创 2016-11-23 09:13:32 · 275 阅读 · 0 评论