Leetcode
文章平均质量分 61
kakulukia
这个作者很懒,什么都没留下…
展开
-
Number of 1 Bits
求一个无符号32位int有几个1bit。本人只想到了最原始的最末位与0x01与,再右移一位。解答有一个构造了几个int来按位与的逻辑挺巧妙,只需要与几次就能得出结果,不过短时间内可能构造不出需要的int。本人肯定是不行。本人代码如下:int hammingWeight(uint32_t n) { int result = 0; while (n > 0) {原创 2015-05-09 14:46:44 · 198 阅读 · 0 评论 -
House Robber
豪斯强盗。这道题很好的应用了简单的动规,对于我这种初识动规的人恰到好处,01背包暂时还理解不能。简单解释就是不能连续选取相邻的值,在此条件下如何取到最大值。因此对于第n家来说,如果不抢(0)则value等于抢了第n-1家的value,如果要抢(1)则value等于不抢(0)上一家+第n家的value。直到抢劫完毕返回不抢(0)和抢(1)的value两者最大即可。这道动规比爬楼梯那个更形象,因为楼梯原创 2015-05-09 21:49:08 · 219 阅读 · 0 评论 -
Reverse Integer
第一反应的逻辑竟然是用字符串来处理,也是服了自己,代码如下:int reverseInt(int x){ long result = 0; bool isPostive; if (-x < 0) isPostive = true; else isPostive = false; if (!isPostive)原创 2015-05-05 22:34:31 · 282 阅读 · 0 评论 -
Longest Common Prefix
最初将题目理解成共同子串是可以出现在中间的,难度瞬时提高。后来提交程序被error后才发现原来子串是要求同位的,于是难度瞬时降低。不过还是出现了OJ时runtime error但本地无问题的情况,之后也遇到过好几次这种问题。本人暂时还解决不乐原创 2015-05-06 16:15:21 · 233 阅读 · 0 评论 -
Remove Duplicates from Sorted Array
本题逻辑也算清晰,维护一个n和有效数组的index就行,且递减的n和递增的index是互补的关系:int removeDuplicates(int A[], int n) { int result = n, count = 0, index = 0; for (int i = 0; i < n - 1; i++) { if (A[i] != A[i + 1])原创 2015-05-06 18:33:42 · 159 阅读 · 0 评论 -
String To Integer(atoi)
通过率很低的一道easy题,题目难就难在要过滤各种不合理字符串输入(多个正负号、0的处理、义字符、符号插入等等),还要考虑越界问题。我费尽力气解决了输入问题后,屡次出现越界问题,于是怒看解答终于AC。。。自己的版本老有个case(-2147483647)过不去,但在自己机器上是正确的,无奈。。。也贴上来作为轨迹:long long tenPower(int power){ lon原创 2015-05-06 10:29:50 · 204 阅读 · 0 评论 -
Roman to Integer
int singleRomanToInt(char c){ int result = 0; switch (c) { case 'I': result = 1; break; case 'V': result = 5; break; ca原创 2015-05-06 11:12:21 · 265 阅读 · 0 评论 -
Merge Two Sorted Lists
自己的第一个版本是重新构建了一个新的list,所以用了很多malloc,然后对于这种数据结构的题目,要特别注意判断指针是否指向NULL的情况(末尾),当时就老error,因为总是没考虑到末尾的情况。malloc新node的AC版本:struct ListNode *mergeTwoLists(struct ListNode *l1, struct ListNode *l2){ i原创 2015-05-06 18:19:00 · 178 阅读 · 0 评论 -
Remove Nth Node From End of List
直观思维先走到底得出node数目count,再从前走count - N。很明显时间复杂度2n,这是最直白最普通的思维,没有联系计算机相关数据结构知识,所以效率差。之后看了解答用了双指针,让fast先走N步然后slow再同时走,那么fast到底时slow就是目标位置。这才是计算机式的解答。本人AC版:/** * Definition for singly-linked list. * s原创 2015-05-06 17:07:05 · 200 阅读 · 0 评论 -
Valid Parentheses
翻回这道题都被自己答案吓一跳,竟然真的写了个链栈,好像是为了复习下链栈才这样写的。其实用顺序栈就足够了(用数组代替)。链栈AC版本:typedef struct stack_node { char data; struct stack_node *next;}stackNode;typedef struct char_stack { //其实可以直接用stackNode原创 2015-05-06 18:11:49 · 205 阅读 · 0 评论 -
Palindrome Number
判断是否为回文数。有了反转integer的例子,求回文数就很简单了。代码如下:bool isPalindrome(int x) { bool result = false; int tempx = x; int y = 0; for(; tempx > 0; tempx /= 10){ y = tempx % 10 + y * 10;原创 2015-05-06 11:06:18 · 219 阅读 · 0 评论 -
Remove Element
有了上一题remove的经验,这道题就简单多了,只要remove掉target就行。仍然维护一个count N和一个有效数组的index:int removeElement(int A[], int n, int elem) { int result = n; int index = 0; for (int i = 0; i < n; i++) { if原创 2015-05-06 21:14:54 · 183 阅读 · 0 评论 -
Plus One
一个int数组的尾数加一。可能题目的意义在于可以引申到大数加法吧,否则就题目本身而言没什么意义。唯一要考虑的当然就是进位了。代码如下:int *plusOne(int *digits, int len, int *newLen){ int *result = (int *)malloc(sizeof(int) * len); *newLen = len; mems原创 2015-05-07 14:47:17 · 184 阅读 · 0 评论 -
Climbing Stairs
读到题目时以为组合可以超出n(例如n=3,则1,1,2),后来看了解释发现是不行的,要不组合就没规律了。这道题也初步让本人认识了动态规划。就本题而言还是比较简单地动规(那个01背包的动规暂时还消化不了):当在第n级台阶时,有2种方法从低级台阶上来,从n-1迈1步上来或者从n-2迈2步上来,则n-1和n-2也同理继续递归下去,直到n=1和n=2状态终止。状态方程还是很好写出的:f(n) = f(n-原创 2015-05-07 14:59:45 · 212 阅读 · 0 评论 -
Remove Duplicates from Sorted List
这题本人充分吸收了前几道链表题的经验,设了头节点、设了slow、fast双指针来协助解题,不再是单一思维的注视问题而是根据数据特点选择有效结构来帮助解题,就像做解析几何会画高质量辅助线一样。如下:struct ListNode *deleteDuplicates(struct ListNode *head) { if (head == NULL) return NU原创 2015-05-07 15:13:20 · 186 阅读 · 0 评论 -
Valid Sudoku
因为题目才初步了解了数独,原来一直以为跟中国的九宫格类似。既然要判断唯一性,那很自然地想到hash,用一维数组判断单列数独就够了。单行单列都好判断,难的是小3 x 3方格内的判断。思路只想到了分为3大行,后来看了解答知道还应该再分3大列。解答的那几重循环还是挺巧的,自己写估计得琢磨半天。代码如下:int hashSudoku(int *hashtable, int number){原创 2015-05-07 10:39:58 · 189 阅读 · 0 评论 -
Count and Say
初看的时候还理解错了,以为每一个1都要用11来代替,那第二个11就可以无限循环了。。。后来提交代码后才发现原来是数连续出现数字的个数。很明显的递归逻辑,但用C我只能先malloc一个大内存的char*,再一个循环一次次往里strcpy。如下:char *recuseCAS(char *str, char *result){ int index = 1, resucur = 1;原创 2015-05-07 11:10:37 · 189 阅读 · 0 评论 -
Length of Last Word
很简单的题,从后往前依次判断就行,考虑最后几位是空格的特例就行了。如下:int lengthOfLastWord(char *s) { int result = 0; long l = strlen(s); char *cp = s; int flag = 0; for (int i = l - 1; i >= 0; i--) {原创 2015-05-07 11:23:05 · 181 阅读 · 0 评论 -
Merge Sorted Array
合并已排序数组。如果想到了从a数组m+n-1往前排则没什么难的,跟合并链表类似还不用修改指针。但当时本人思维还是愣愣的从前往后排,那就还需要保存a被替换的值且还不定个数,也没想到合并后a数组个数必然为m+n-1,难度陡增。于是意识到一到easy题肯定是自己思维错了。如下:void merge(int A[], int m, int B[], int n) { int ap = m原创 2015-05-07 15:19:03 · 179 阅读 · 0 评论 -
Symmetric Tree
镜像树。有了上一题判断same tree的经验,只需要稍稍改动,让遍历顺序相对起来就行。如下:bool traverseSymmetric(struct TreeNode *n1, struct TreeNode *n2){ if (n1 == NULL && n2 == NULL) return true; if (n1 == NULL || n2 ==原创 2015-05-07 15:49:35 · 236 阅读 · 0 评论 -
Pascal's Triangle
这是杨辉三角吧,歪果仁是叫帕斯卡三角么。看见要返回多维数组,果断选择c++,用c的话malloc又得弄半天。如下:class Solution {public: vector > generate(int numRows) { vector >result; int lastleft = 0, last = 0; for (int原创 2015-05-07 18:06:59 · 260 阅读 · 0 评论 -
Valid Palindrome
回文数的另一种形式。比int的回文稍难,但思路还是比较清晰的,判断好大小写、空格、义字符就行。如下:bool isAlpha(char *s){ bool reuslt = false; if ((*s >= 'a' && *s = 'A' && *s = '0' && *s <= '9')) { reuslt = true; } retu原创 2015-05-07 19:28:59 · 208 阅读 · 0 评论 -
Factorial Trailing Zeroes
该题想了好久写了几个版本都超时,怒看解答,发现这更多的是个数学题。突然很烦leetcode上那个叫@ts的人。好几题经过语言包装的数学题都是这哥们提供的。。。其实该题剥开外衣,问的就是有几个5。。。因为只有5X2才能产生0,而2个数一定大于5的,所以有几个5就有几个0.代码如下:int trailingZeroes(int n) { int result = 0; wh原创 2015-05-07 21:05:02 · 255 阅读 · 0 评论 -
Excel Sheet Column Title
这也是一道通过率偏低的easy题,但逻辑蛮明显的没什么难点,更多地是数字规律转化的考查。自己写的时候竟然是从后往前取余的,所以最后还得翻转回来,其实可以从前往后的,也就不用多此一举了。如下:char* convertToTitle(int n) { // if (n == 0) // return NULL; char *result = (char *)m原创 2015-05-07 20:08:30 · 222 阅读 · 0 评论 -
Excel Sheet Column Number
之前一道题的逆问题。逻辑也很清晰,关键在于数字规律转化弄清楚就行。如下:int twitySixPowers(int n){ int result = 1; while (n > 0) { result *= 26; n--; } return result;}int titleToNumber(char* s) {原创 2015-05-07 21:04:00 · 222 阅读 · 0 评论 -
Same Tree
二叉树的题目,中序遍历每个节点就行,如果不是同时走到叶子或者值不同,当然就不一样。如下:bool isSameTree(struct TreeNode *p, struct TreeNode *q) { if (p == NULL && q == NULL) return true; if (p == NULL || q == NULL) r原创 2015-05-07 15:42:38 · 167 阅读 · 0 评论 -
Intersection of Two Linked Lists
找到两个单链表的共同插入点。刚开始还以为共同点后有可能出现不同node于是还得判断插入点是否准确,后来发现多虑了。看来e文的题目描述很容易让自己产生misunderstood。逻辑写了好几个都错了,后来从网上考了一个我觉得是错误的解答,竟然AC了,也许是返回值正确吧。之后看了solution后,找到了一个还算巧妙的方法:设立2个ap、bp指针分别指向A 、B,当ap走到底时指向B头,当bp走到原创 2015-05-07 19:38:17 · 233 阅读 · 0 评论 -
Majority Element
一看到要计数的,首先想到了hash表。不过本人的hash表很简单,就是一个数组而已,hash函数也仅仅是取余数这么简单,但明显是扩展不能的(如果int数组的数值都很大,那么size要爆)。后来用例的一个-1直接完爆本人的取余哈希表。。。个人觉得一道easy题还要写二次探测的hash表是不合格的hash。。。于是翻看解答,一个叫Moore voting algorithm的算法很简单有效,不过该原创 2015-05-07 20:35:11 · 230 阅读 · 0 评论 -
Pascal's Triangle II
比一式简单,至少不用返回多维数组。不过不知为何再翻回来的时候OJ的函数申明貌似跟AC的不一样了,但反正当时是AC了的。如下:struct IntArray { int* elements; int size;};struct IntArray* getRow(int rowIndex) { if (rowIndex < 0) return NULL;原创 2015-05-07 18:24:20 · 213 阅读 · 0 评论 -
Maximum Depth of Binary Tree
求二叉树的深度。依次遍历,深度优先,没什么难点吧。维护一个深度就可以了。代码如下:int depthOfTree(struct TreeNode *node, int depth, int *result){ if (node == NULL) return *result; if (*result < depth) *result = d原创 2015-05-07 17:29:01 · 173 阅读 · 0 评论 -
Compare Version Numbers
逻辑也很明确,找到每一个".",然后转化为int数值来比较大小。如下:int compareVersion(char* version1, char* version2) { //"123.456" "01" "1" "1.0" "0.1" "0.1.1" int result = 0; int v1 = 0, v2 = 0; int i = 0, j = 0;原创 2015-05-07 19:59:39 · 269 阅读 · 0 评论 -
Binary Tree Level Order Traversal
本题答案参考了解答,觉得解答是取巧的方法,根本上来说还是深度优先,只是加设了一个level参数来控制回退时val写进的数组,没有用队列。如下:/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *原创 2015-05-07 16:08:59 · 218 阅读 · 0 评论 -
4-h-Median of Two Sorted Arrays
求2个已排序数列的中值。leet的第一道hard题,其实可以用笨方法将2数组合并直接求中位数也能AC,但意义不大。网搜了下,该题算法逻辑还算好理解,用了类似二分法的思想,每次都可以剪一半的枝,但支持该算法的证明不是那么容易就能想到。要注意的是程序中k是现实中的序号,所以代码中要将k减去1以符合数组下标。我只想说,这种题如果真的在面试时遇到,能有人真的从无到有一小时内证明理论并写出该算法吗?原创 2015-06-19 19:57:03 · 332 阅读 · 0 评论 -
41-h-firstMissingPositive
找出数组中缺少的第一个正数。普通思想就是排序,然后遍历,要注意排序后有可能出现相同数字。另一种逻辑就是将a[i]排列到i-1上,然后遍历时就数组序号比较,第一个不等于数组序号的即为所求。真搞不懂leet的难度是怎么划分的,有的easy题如atoi、itoa的我感觉至少是m难度,本题顶多也就m难度,不知为何是h。排序遍历的如下:void swapArrayNumbers(int *a,原创 2015-06-21 14:54:03 · 282 阅读 · 0 评论 -
18-m-4Sum
基本思路跟3sum一样,排序后两边夹,多了一层循环。但多了一层循环,就多了好多判断,尤其是有相同数字时要跳过已成为解的数字组合,同时也要注意要组合到所有数字。提交了不少次,都是要么少解要么重复解,一个个改进后最后AC。不得不再次赞一下leet的测试用例,确实把编写过程中我出现的细微bug都测出来了,当然这也说明自己还需要继续提高。另外这可能是为数不多n³时间度的题目吧,原以为会超时的。如下:原创 2015-06-26 22:38:18 · 339 阅读 · 0 评论 -
17-m-Letter Combinations of a Phone Number
输出所有号码的字母组合。题意很明确逻辑也很好理解,也知道要递归,但就是老写错。翻了解答,关键错在控制递归层次的一个参数。由于是函数要传的参数,所以要在递归传参时用参数+1的形式传到子函数,不能在本层内++,否则会一直加下去(函数传参相当于一直持有了)。另外原想用c在char **result每次添加新字符串时再realloc,意图做到动态内存分配,结果失败。一个诡异的现象就是递归子函数中rea原创 2015-06-24 21:01:34 · 350 阅读 · 0 评论 -
22-m-Generate Parentheses
生成n对匹配的括号。逻辑也挺明显的,跟电话号码那题有点像,递归解决。不同的是本题要用n来控制左括号和右括号数目,基本思路是同层优先进左括号,然后右括号,有点像二叉树的中序遍历。仍然要注意递归时控制层次的参数要在传参时加1而不能在函数体内加1。另外本题用c完成,仍然没有做到内存动态分配,realloc老出错,只能预先分配一个大内存。如下:void backTrackingParenthe原创 2015-06-25 11:27:10 · 287 阅读 · 0 评论 -
227-m-Basic Calculator II
四则运算。真的只是四则而已,没有要求括号只有加减乘除,因此还算是简单的,难点可能就在对乘除的处理上。最开始写的是将操作数和操作符全部分别提取到2个数组中,再一个个出栈运算,发现不好写,因为数组是静态栈消不掉元素。后来还是在操作数入栈的时候就做处理,如果是乘除的直接算出结果再入栈,最后对2个栈进行加减法就可以了。本题写的逻辑一般,空间还占用了不小(因为用了2个数组做栈,用例中有上万个元素的例子,所以原创 2015-07-07 14:54:34 · 341 阅读 · 0 评论 -
39-m-Combination Sum
求指定组合和。由于抽取数量不受限制,所以可以归结为前几道m题回溯的类型,比如求电话号码组合。用类似dfs的思路,先最小的递归到底与target比较,然后回溯到上一层将next入列继续比较,如此反复。有了之前几题backtracking的经验,这道题基本框架可以继续用之前的,但要求不能有重复的,所以需要传一个参控制起始数字。其实,如果输入数组为{1,2},target任意,那么本题就是求第tar原创 2015-06-25 21:58:50 · 334 阅读 · 0 评论 -
Contains Duplicate
数组内是否有重复项。很明显要哈希。不过easy级别的题目考查哈希都是很简单的数组应用,基本没考查碰撞,只是要求至少有这种思维。这道题的测试用例似乎还都是正数,所以用一个bool数组做哈希表就够了。如下:bool containsDuplicate(int* nums, int numsSize) { if (nums == NULL || numsSize == 0)原创 2015-06-11 16:06:44 · 245 阅读 · 0 评论