随笔分类 -  LeetCode

摘要:正则表达式的匹配,还是挺难的。可根据下一个字符是不是*分为两种情况处理,需要考虑多种情况。 bool isMatch(const char *s, const char *p) { if (*p == '\0')return *s == '\0'; //如果下一个不是*(*可表示前一个字符的数量) 阅读全文
posted @ 2016-05-24 16:20 牧马人夏峥 阅读(142) 评论(0) 推荐(0)
摘要:很经典的一道题,最长回文子串,有多种方法。 首先介绍的一种方法是从中间向两边展开。注意区分aba和abba型的回文串;如果当前最长的子串已经当于两边中最长的子串了,则无需再去判断。 //从中间向两边展开 string expandAroundCenter(string s, int c1, int 阅读全文
posted @ 2016-05-24 15:07 牧马人夏峥 阅读(171) 评论(0) 推荐(0)
摘要:比较简单,细节:先将字符串翻转,注意进位。 string addBinary(string a, string b) { string result; int len = a.size() > b.size() ? a.size() : b.size(); reverse(a.begin(), a. 阅读全文
posted @ 2016-05-23 13:10 牧马人夏峥 阅读(117) 评论(0) 推荐(0)
摘要:字符串转为数字,细节题。要考虑空格、正负号,当转化的数字超过最大或最小是怎么办。 int atoi(char *str) { int len = strlen(str); int sign = 1; int num = 0; int i = 0; while (str[i] == ' '&& i < 阅读全文
posted @ 2016-05-23 12:53 牧马人夏峥 阅读(275) 评论(0) 推荐(0)
摘要:字符串的匹配,返回匹配开始的位置,直接用暴力方式求解。为了更快的匹配,定义一个指针表示待匹配的字符串的长度,当长度不足时,可 直接停止匹配。 char *strStr(char *haystack, char*needle) { char* p1; char* p2; char* p1_advanc 阅读全文
posted @ 2016-05-23 12:30 牧马人夏峥 阅读(113) 评论(0) 推荐(0)
摘要:很实际的一道题。定义一个双向链表list,方便插入和删除;定义一个哈希表,方便查找。 具体的,哈希表存放每个结点的key和它对应的结点的地址;访问结点时,如果结点存在,则将其交换到头部,同是更新哈希表中的地址; 插入结点时,首先判断capacity是否达到了上限,如果是则在链表和哈希表中删除该结点; 阅读全文
posted @ 2016-05-23 11:03 牧马人夏峥 阅读(156) 评论(0) 推荐(0)
摘要:找到中间结点,将后半部分反转接入即可。 ListNode *reoderList(ListNode* head) { if (head == nullptr || head->next == nullptr)return head; //找到中间结点的方法很巧妙 ListNode *slow = h 阅读全文
posted @ 2016-05-21 16:14 牧马人夏峥 阅读(131) 评论(0) 推荐(0)
摘要:两个思路,一是用哈希表记录每个结点是还被访问过;二是定义两个快、慢指针,如果存在环的话,两个指针必定会在某位结点相遇。 bool linkListNode(ListNode *head) { ListNode *fast=head, *slow=head; while (fast && fast-> 阅读全文
posted @ 2016-05-21 16:02 牧马人夏峥 阅读(99) 评论(0) 推荐(0)
摘要:深拷贝一个链表,不同的是这个链表有个额外的随机指针。参考:http://blog.csdn.net/ljiabin/article/details/39054999 做法非常的巧妙,分成三步,一是新建结点,并放在旧结点之后;二是修改新结点的random指针;三是将新旧链表断开。 RandomList 阅读全文
posted @ 2016-05-21 15:29 牧马人夏峥 阅读(111) 评论(0) 推荐(0)
摘要:这题有点繁琐,在更新指针时很容易出错。 ListNode *reverseKGroup(ListNode *head, int k) { if (head == nullptr || head->next == nullptr || k < 2)return head; ListNode dummy 阅读全文
posted @ 2016-05-19 15:52 牧马人夏峥 阅读(159) 评论(0) 推荐(0)
摘要:不允许通过值来交换,在更新指针时需要小心。 ListNode *swapNodes(ListNode* head) { ListNode dummy(-1); dummy.next = head; for (ListNode *prev = &dummy, *cur = prev->next, *p 阅读全文
posted @ 2016-05-19 14:48 牧马人夏峥 阅读(117) 评论(0) 推荐(0)
摘要:这题比较简单,方法有很多。其中一种比较有意思的做法是设置两个指针,一个先走n步,然后再一起走。一个到了末尾,另一个也就确定了要删除元素的位置。 ListNode *removeNthFromEnd(ListNode *head, int n) { ListNode dummy{-1, head}; 阅读全文
posted @ 2016-05-19 14:27 牧马人夏峥 阅读(107) 评论(0) 推荐(0)
摘要:这题我的第一想法是用头插法,但实际上并不好做,因为每次都需要遍历最后一个。更简单的做法是将其连成环,找到相应的位置重新设头结点和尾结点。这过 有很多细节需要注意,比如K有可能是大于链表长度的,如何重新设置K等都要注意。 ListNode *rotateList(ListNode *head, int 阅读全文
posted @ 2016-05-19 14:06 牧马人夏峥 阅读(119) 评论(0) 推荐(0)
摘要:很简单的一题,需要注意的是如果某结点重复了记得将其删除。 ListNode *deleteDuplicates(ListNode *head) { if (head == nullptr) return nullptr; ListNode *prev = head; for (ListNode *c 阅读全文
posted @ 2016-05-18 15:34 牧马人夏峥 阅读(131) 评论(0) 推荐(0)
摘要:思路就是定义两个链表,一个放大的,一个放小的,最后将两个连起来,注意细节问题。 ListNode *partionList(ListNode *head, int value) { ListNode left_dummy(-1); ListNode right_dummy(-1); auto lef 阅读全文
posted @ 2016-05-18 15:15 牧马人夏峥 阅读(101) 评论(0) 推荐(0)
摘要:这题用需要非常细心,用头插法移动需要考虑先移动哪个,只需三个指针即可。 ListNode *reverseList(ListNode *head, int m, int n) { ListNode dummy(-1); dummy.next = head; ListNode *prev = &dum 阅读全文
posted @ 2016-05-18 14:45 牧马人夏峥 阅读(113) 评论(0) 推荐(0)
摘要:这题并不难,但需要注意细节。 ListNode* addTwo(ListNode *l1, ListNode *l2) { ListNode dummy(-1); int carry = 0; ListNode *prev = &dummy; for (ListNode *pa = l1, *pb 阅读全文
posted @ 2016-05-18 14:00 牧马人夏峥 阅读(83) 评论(0) 推荐(0)
摘要:看见这题我的第一反应是用哈希来做,不过更简洁的做法是用异或来处理,只要是偶数个都为0(0和任意数异或仍为数本身)。 int singleNumber(int A[], int n) { int x = 0; for (int i = 0; i < n; i++) x ^= A[i]; return 阅读全文
posted @ 2016-05-17 15:14 牧马人夏峥 阅读(95) 评论(0) 推荐(0)
摘要:这题的思路很巧妙,分两遍扫描,将元素分别和左右元素相比较。 int candy(vector<int> &rattings) { int n = rattings.size(); vector<int> incrment(n); int inc = 1; //和左边比较 for (int i = 1 阅读全文
posted @ 2016-05-17 15:02 牧马人夏峥 阅读(127) 评论(0) 推荐(0)
摘要:这题的思路很巧妙,用两个变量,一个变量衡量当前指针是否有效,一个衡量整个数组是否有解,需要好好体会。 int gasStation(vector<int> &gas, vector<int> &cost) { int total = 0; int j; int sum = 0; for (int i 阅读全文
posted @ 2016-05-16 14:40 牧马人夏峥 阅读(96) 评论(0) 推荐(0)