leetcode(Java实现)
文章平均质量分 62
专栏中主要是leetcode题库中的一些常见面试,笔试题。
代码均用java实现,实现过程中包含解题思路,并含有大量细节的注释,方便大家学习交流。
一天一题,点点滴滴,菜鸟的逆袭之路
zzc8265020
这个作者很懒,什么都没留下…
展开
-
leetcode——8 String to Integer (atoi)(自定义字符串转整型,如何避开各种奇葩输入)
解题思路: 题目不难,主要考察对各种输入的综合处理,如空字符串:“”; 多空格:“ 123 1 2 1” ;多符号:“+-123” ;多字符:“+abc123”,以及溢出。返回结果由两部分构成:基数+符号,因此需要将两部分分别求解。在程序设计初就要针对各种输入进行处理。编程的逻辑思维大致分四步: (1)空字符串的处理:如果字符串位空返回0即可 (2)空格的处理:使用循环遍历,将指针跳过空格即可 (3)符号的处理:设置一个符号标识sign,遍历时首先遇到的符号为输出结果的符号 (4)数字与溢出原创 2015-06-24 09:37:37 · 564 阅读 · 0 评论 -
leetcode——169 Majority Element(数组中出现次数过半的元素)
解题思路: (1)使用HashMap,Map的特点:不允许重复元素,因此在存储前需要判断是否存在 (2)判断HashMap中存在nums[i],如果存在,使用hm.get(nums[i])获取value,即通过key来获得value值,即count(出现的次数) (3)如果count大于数组长度的一般,即返回该元素 (4)如果count不满足条件,向HashMap存储元素以及出现的次数。原创 2015-06-23 09:23:00 · 1079 阅读 · 0 评论 -
leetcode——168 Excel Sheet Column(整数与表格字母的映射)
解题思路: (1)找到对应关系,26进制,1对应A(对应的ASCII码为65) (2)不难看出规律为: Char temp=(n-1)%26+'A' ,或者 Char temp=(n-1)%26+65 (3)使用while循环进行对应位的分离与处理原创 2015-06-23 09:26:13 · 576 阅读 · 0 评论 -
leetcode——165 Compare Version Numbers(数字版本的比较)
解题思路: (1)使用splt(“\\.”)对应小数点进行分离,然后逐个比较 (2)比较过程中,我们假定数组的长度一致。长度较短的数组,当比较到最后一个元素以后,往后自动加0操作原创 2015-06-23 09:28:59 · 1094 阅读 · 0 评论 -
leetcode——171 Excel Sheet Column Number (表格字母与整数的映射)
解题思路: A—Z 26个字母,AA出现27,则进制为26,。因此只需将给定字符串从高为到低位依次遍历,然后运算即可。原创 2015-06-22 10:24:55 · 507 阅读 · 0 评论 -
leetcode——7 Reverse Integer(附有溢出整数翻转的实现)
解题思路: (1)从给定数n的低位进行分离:int s=n%10; (2)分离出的数,进行等效翻转操作:sum=sum*10+s; 为了防止溢出操作,将sum的类型定义为:long (3)n/=10;继续循环操作 (4)检查是否溢出:如果sum>Integer.MAX_VALUE||sum<Integer.MIN_VALUE,则已经溢出,返回为0;如果没有溢出将sum强制类型转换为int即可原创 2015-06-19 09:40:49 · 702 阅读 · 0 评论 -
leetcode——172 Factorial Trailing Zeroes(N!尾巴上有多少个0,算法复杂度为lg)
思路一:想的比较简单,先实用for循环进行阶乘运算,然后mod10计算0的个数,但是在OJ检查时,超时!,显然是没满足算法时间复杂度为lg的要求。(失败)思路二(推荐):只有在2*5的时候才会出现0,其中整十的数也可以看成是2*5的结果,因此,只要在n之间看有多个2,多少个5即可,不难发现2的个数大于5的个数,因此只需要要记录5的个数即可。但是需要注意的是:像25,125,625之类的数,除以5以后的结果还是5的倍数,所以还需要继续循环处理。(OJ测试成功)原创 2015-06-19 09:46:00 · 1004 阅读 · 0 评论 -
leetcode——6 ZigZag Conversion(折线行列输出问题)
解题思路: 因为行数为变量,因此我们需要找到每一行的规律。例如:当行数numRows=4时,则ZigZag应该按下列方式排列不难看出,满数为4的列之间的步数为4,实际上,此时步的规律为:step=2*numRows-2 =2*4-2=60 6 12 181 5 7 11 13 17 192 4 8 10 14 16 203 9 15 21 接着我们看非满数的列,不难看出此类原创 2015-06-18 17:01:45 · 519 阅读 · 0 评论 -
leetcode——190 Reverse Bits(32位无符号二进制数的翻转)
解题思路: (1)将需要翻转的数n跟1进行“&”运算,取得最低位上的数, (2)左移到对应位置上,实现翻转。 (3)将翻转的结果加入到result中 (4)将n>>1右移一位,继续遍历原创 2015-06-17 22:32:59 · 1679 阅读 · 0 评论 -
leetcode——198 House Robber(小偷盗取不相邻房间金钱总数最大:动态规划问题)
解题思路: 思路一:A[i][0]表示第i次没有抢劫,A[i][1]表示第i次进行了抢劫,即A[i+1][0] = max(A[i][0], A[i][1]).. 那么rob当前的house,只能等于上次没有rob的+money[i+1], 则A[i+1][1] =A[i][0]+money[i+1].实际上只需要两个变量保存结果就可以了,不需要用二维数组。 思路二:找到递推关系:maxV[i] = max(maxV[i-2]+num[i], maxV[i-1])原创 2015-06-16 22:02:47 · 2340 阅读 · 0 评论 -
leetcode——191 Number of 1 Bits(汉明重量:计算二进制数中1的个数)
解题思路: 思路一:最直接的方法就是不断 mod 2 判断是不是 1 ,但是在leetcode的OJ测试时,当n=2147483648时就会报错,后来百度一下知道,输入的n是正整数32bit,也就是无符号的,java的int是有符号的,也就是说32bit里还包含负数,当然输入2147483648时就超出你的输入参数的范围啦。(OJ检查失败) 思路二:基本与思路一类似,只是采用的形式不一样,引入了“位运算”,即每次将n>>1(向右移动一位)然后同1进行&(与运算),这个思路当输入i是正数时没原创 2015-06-16 22:07:13 · 729 阅读 · 0 评论 -
leetcode——226 Invert Binary Tree(翻转二叉树,会做就能进谷歌哦~~)
背景介绍:此题为Google面试官面苹果高级架构工程师、Homebrew 的作者、tweet的创始人:Max Howell的一道题,因为不会做,直接给拒了,真心是醉了。解题思路:直接获取根节点的左右节点,然后进行交换即可。方法一直接进行交换,方法二使用二叉树层次遍历(配合列队、栈),话不多说直接上代码。原创 2015-06-12 17:10:21 · 3901 阅读 · 0 评论 -
leetcode——219 Contains Duplicate II(包含重复的数II)
解题思路: 定义一个长度最大为k的滑动窗口,用一个set维护窗口内的数字判断是否出现重复,使用两个指针start和end标记滑动窗口的两端,初始都是0,然后end不断进行扩展,扫描元素判断是否出现重复元素,直到发现end-start>k, 就开始移动start,并且在set中移除对应的元素。如果以为扫描到数组末尾还没有发现重复元素,那就可以返回false。原创 2015-06-12 16:05:53 · 537 阅读 · 0 评论 -
leetcode——13 Roman to Integer(罗马数字转换成整数)
解题思路: 首先要来了解一下罗马数字表示法,基本字符有7个:I,V,X,L,C,D,M,分别表示1,5,10,50,100,500,1000。在构成数字的时候,有下列规则:1、相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ= 3;2、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ= 8;Ⅻ= 12;3、小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ=4;Ⅸ=9;4、正常使用时,连写的数字重复不得超过三次原创 2015-06-11 19:18:09 · 918 阅读 · 0 评论 -
leetcode——189 Rotate Array Total(数组的翻转)
解题思路: 先将5以前的数据翻转得到的数组是[4,3,2,1,5,6,7] 再将5及以后的数据翻转得到的数组是[4,3,2,1,7,6,5] 再将整个数组翻转即得到[5,6,7,1,2,3,4]. (即为所求)原创 2015-06-11 16:09:10 · 548 阅读 · 0 评论 -
leetcode Count Primes 204
leetcode Count Primes 204Sieve of Eratoasthenes原创 2015-05-21 09:47:39 · 558 阅读 · 0 评论 -
leetcode Remove Linked List Elements 203
leetcode Remove Linked List Elements 203原创 2015-05-22 11:12:02 · 476 阅读 · 0 评论 -
leetcode Happy Number 202
leetcode Happy Number 202原创 2015-05-22 15:28:19 · 641 阅读 · 0 评论 -
leetcode Longest Common Prefix 14
解题思想:使用中间变量temp将出现的公共String进行sub,即抽取出来。然后依次往下进行循环遍历即可心得:尝试一与尝试二的解题思想是一样,但是尝试一未能避开一些一般性的测试输入,如:{a,b,c} ,这个我使用了两个for循环进行遍历进行排除,太麻烦。 {“”,“”,“”}三个空字符串,没能排除,于是使用尝试二的方法,成功避开一些意外输入。原创 2015-05-25 11:52:11 · 460 阅读 · 0 评论 -
leetcode 101 Symmetric Tree
leetcode 101 Symmetric Tree解题思路:根节点进行左右子节点判断,子节点对其同级子节点进行子节点的左右判断,使用递归与迭代的思想即可实现。原创 2015-05-26 15:52:15 · 545 阅读 · 0 评论 -
leetcode 19 Remove Nth Node From End of List
删除链表的倒数第n个元素思路一:先统计链表中节点的个数,然后再计算出倒数第n个是正数第多少个,再进行移除即可,但这样的话就不满足one pass的要求。(放弃)思路二:p先跑n个节点,随后p,q一起跑,待p跑到链表尾部时,q节点刚好跑到需要移除的节点的前节点上, 然后进行跳过处理即可原创 2015-05-27 11:22:11 · 616 阅读 · 0 评论 -
leetcode—102 Binary Tree Level Order Traversal(二叉树的层次遍历)
解题思路:广度遍历而且要记录每一层。广度遍历利用队列实现,记录用列表实现使用一个列队,一个列表。 列队用于记录每一层节点,列表用于存储每一层的节点原创 2015-06-03 10:30:57 · 1511 阅读 · 3 评论 -
leetcode—58 Length of Last Word Total(字符串中最后一个单词的长度)
解题思路:方法一:刚开始这道题想的太简单了,首先最开始的想法是得知s的长度,然后从头开始遍历找到最后一个空格的位置,作减法就可以得到最后单词的长度然而忽略了,如果这个字符串结尾有空格的情况。如“a ”。于是改变思路,从后面开始遍历,找到最后一个单词的最后一个字符开始计数,然后依次向前知道遇到第一个空格。方法二:使用投机取巧的方法,用split函数把字符串按照空格分隔好,返回最后那个就行。。。原创 2015-06-03 16:05:43 · 1289 阅读 · 1 评论 -
leetcode—217 Contains Duplicate(包含重复的数)
解题思路: 起初使用的HashMap,一个for循环,将i与数组中的值nums[i],作为键值对进行存储,如果不重复,存入,如果重复直接返回true。 但是在leetcode的OJ编译时,出现了time limited限制。 随后,查阅资料,此处应该使用HashSet,因为HashMap存储时是对键值对进行存储,如果用一个无穷,不重复的数组进行判断,复杂度与时间消耗是很多的。 而HashSet的好处在于:HashSet实现了Set接口,它不允许集合中有重复的值,在进行存储时,先进行判断,使用conta原创 2015-06-04 11:37:50 · 2663 阅读 · 0 评论 -
leetcode—66 Plus One(数组中的值+1进位操作,数组扩充)
解题思路:这是一道比较简单的题目,对一个数组进行加一操作。但是可不要小看这个题,这个题被称为“Google最喜欢的题”,因为在google面试中出现的频率非常高。从数组的最后一位开始加1,需要考虑进位,如果到[0]位之后仍然有进位存在,需要新开一个长度为(n.length + 1)的数组,拷贝原来的数组。题意:一个整数按位存储于一个int数组中,排列顺序为:最高位在array[0] ,最低位在[n-1],例如:98,存储为:array[0]=9; array[1]=8,然后进行+1操作,即98+1,在数原创 2015-06-05 15:44:41 · 1488 阅读 · 0 评论 -
leetcode——206 Reverse Linked List(单链表的反转)
解题思路: 反转一个单链表,其实就是要把指针的方向反一下而已。于是可以新建一个单链表,从前往后遍历参数链表的时候,新建一个单链表,从前往后遍历参数链表的时候,将每个节点插入新建链表的头部即可;原创 2015-06-08 20:08:49 · 975 阅读 · 0 评论