楼主: love1point
跳转到指定楼层
上一主题 下一主题
收起左侧

Leetcode 刷题记录!!!不信自己今年找不到工作!!!

 
🔗
 楼主| love1point 2015-6-1 09:18:15 | 只看该作者
全局:
本帖最后由 love1point 于 2015-6-26 17:21 编辑

Reverse words in a string:  https://leetcode.com/problems/reverse-words-in-a-string/
idea: 此题还是有点难度的,尤其最后一行代码。 通过这题学到,string的很多题目用StringBuilder

6.26.2015 更新: 看了网上的讨论,这题一个for 循环应该是时间复杂度最低的了。首先用正则表达式把String 根据 空格 把 单词分开放到数组里,但空格不包含进去,就是这行代码   String[] str = s.split(" ");
str 就是 ["the", "sky", "is", "blue"]. 然后从最后面开始,即blue这个string, 依次把单词加入到 string里。最后把stringbuilder 输出。 也不是一次就能写出这样,比如最后一句,也是要通过test case来更改代码的,

  1. public class Solution {
  2.     public String reverseWords(String s) {
  3.         if(s == null || s.length() == 0)
  4.         {
  5.             return s;
  6.         }
  7.         
  8.         String[] str = s.split(" ");
  9.         
  10.         StringBuilder sb = new StringBuilder();
  11.         for(int i = str.length-1; i >= 0; i--)
  12.         {
  13.             if(!str.equals(""))
  14.             {
  15.                 sb.append(str).append(" ");
  16.         
  17.             }   
  18.         }
  19.         return sb.length() == 0? "" : sb.substring(0,sb.length()-1);
  20.     }
  21. }
复制代码
回复

使用道具 举报

🔗
 楼主| love1point 2015-6-1 09:37:41 | 只看该作者
全局:
本帖最后由 love1point 于 2015-6-25 10:46 编辑

Search insert position:  https://leetcode.com/problems/search-insert-position/
idea: 经过一次很仔细的探讨,此题已很熟练。二分查找法

  1. public class Solution {
  2.     public int searchInsert(int[] nums, int target) {
  3.         int left = 0;
  4.         int right = nums.length-1;
  5.         
  6.         while(left <= right)
  7.         {
  8.             int mid = (left + right) / 2;
  9.             if(nums[mid] == target)
  10.             {
  11.                 return mid;
  12.             }
  13.             else if(nums[mid] > target)
  14.             {
  15.                 right = mid - 1;
  16.             }
  17.             else
  18.             {
  19.                 left = mid + 1;
  20.             }
  21.         }
  22.         return left;
  23.     }
  24. }
复制代码
回复

使用道具 举报

🔗
 楼主| love1point 2015-6-1 10:10:30 | 只看该作者
全局:
本帖最后由 love1point 于 2015-6-16 10:41 编辑

Pascal's triangle:  https://leetcode.com/problems/pascals-triangle/
idea: 此题其实不难,此题对于掌握好ArrayList的用法很有帮助

  1. public class Solution {
  2.     public List<ArrayList<Integer>> generate(int numRows) {
  3.         ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
  4.         
  5.          if(numRows <= 0)
  6.         {
  7.             return result;
  8.         }
  9.      
  10.         ArrayList<Integer> prev = new ArrayList<Integer>();
  11.         prev.add(1);
  12.         
  13.         result.add(prev);
  14.         
  15.         for(int i = 2; i <= numRows; i++)
  16.         {
  17.             ArrayList<Integer> curr = new ArrayList<Integer>();
  18.             
  19.             curr.add(1);
  20.             
  21.             for(int j = 0; j < prev.size()-1; j++)
  22.             {
  23.                 curr.add(prev.get(j) + prev.get(j+1));
  24.             }
  25.             
  26.             curr.add(1);
  27.             
  28.             result.add(curr);
  29.             
  30.             prev = curr;
  31.         }
  32.         
  33.         return result;
  34.     }
  35. }
复制代码
回复

使用道具 举报

🔗
 楼主| love1point 2015-6-1 11:02:35 | 只看该作者
全局:
本帖最后由 love1point 于 2015-6-16 09:44 编辑

Linked list cycle ii:  https://leetcode.com/problems/linked-list-cycle-ii/
idea: 网上大部分解法也是这种。网上还有个定理大概说,要指出他们的相遇点,必须让其中一个节点在 相遇后回到 head节点,然后fast 和 slow再每次加1,再相遇的点就是 cycle开始的点

  1. /**
  2. * Definition for singly-linked list.
  3. * class ListNode {
  4. *     int val;
  5. *     ListNode next;
  6. *     ListNode(int x) {
  7. *         val = x;
  8. *         next = null;
  9. *     }
  10. * }
  11. */
  12. public class Solution {
  13.     public ListNode detectCycle(ListNode head) {
  14.         if(head == null)
  15.         {
  16.             return null;
  17.         }
  18.         
  19.         ListNode fast = head;
  20.         ListNode slow = head;
  21.         
  22.         while(fast != null && fast.next != null)
  23.         {
  24.             slow = slow.next;
  25.             fast = fast.next.next;
  26.             if(slow == fast)
  27.             {
  28.                 fast = head;
  29.                 while(fast != slow)
  30.                 {
  31.                     fast = fast.next;
  32.                     slow = slow.next;
  33.                 }
  34.                 return fast;
  35.             }
  36.         }
  37.         return null;
  38.     }
  39. }
复制代码
回复

使用道具 举报

🔗
 楼主| love1point 2015-6-1 11:46:13 | 只看该作者
全局:
本帖最后由 love1point 于 2015-6-16 09:41 编辑

Maximum depth of binary tree: https://leetcode.com/problems/maximum-depth-of-binary-tree/
idea: 这题用递归做很简单。可用3个节点为例进行过代码。注意递归要有退出,即 if(root == null) 这种

  1. public class Solution {
  2.     public int maxDepth(TreeNode root) {
  3.         if(root == null)
  4.             return 0;
  5.         return Math.max(maxDepth(root.left),maxDepth(root.right))+1;
  6.     }
  7. }
复制代码
回复

使用道具 举报

🔗
 楼主| love1point 2015-6-1 12:25:32 | 只看该作者
全局:
本帖最后由 love1point 于 2015-6-27 19:03 编辑

Remove linked list elements:  https://leetcode.com/problems/remove-linked-list-elements/
idea: 这道题还是要多遍记忆才能掌握好,用到三个辅助变量,helper, p , q6.27.2015更新,经过linked lists专题复习,现在看这题已经变得容易了

  1. public class Solution {
  2.     public ListNode removeElements(ListNode head, int val) {
  3.         ListNode helper = new ListNode(0);
  4.         helper.next = head;
  5.         ListNode p = helper;
  6.         ListNode q = head;
  7.         while(q != null)
  8.         {
  9.             if(q.val == val)
  10.             {
  11.                 p.next = q.next;
  12.             }
  13.             else
  14.             {
  15.                 p=p.next;
  16.             }
  17.             q=q.next;
  18.         }
  19.         return helper.next;
  20.     }
  21. }
复制代码
回复

使用道具 举报

🔗
rogerdai 2015-6-1 15:51:52 | 只看该作者
全局:
楼主可以放到github,看代码更方便些
回复

使用道具 举报

🔗
 楼主| love1point 2015-6-1 16:24:03 | 只看该作者
全局:
rogerdai 发表于 2015-6-1 15:51
楼主可以放到github,看代码更方便些

嗯,但是直接放在一亩三分地更多人可得的啊。放github 链接可能没那么多人可以看到
谢谢你的建议
回复

使用道具 举报

🔗
 楼主| love1point 2015-6-1 16:24:35 | 只看该作者
全局:
本帖最后由 love1point 于 2015-6-25 11:38 编辑

Word break:https://leetcode.com/problems/word-break/
idea: 这题如下解法我觉得比较难,比较难记下来,如果我发现更好解法,我再更新

6.25.2015: 看了网上的大部分解法,这题还是用动态规划去解,因为要保存已有的已经比较过的word。现在代码还是很容易记住的。多写几遍就可以了。可以用题目给的例子去把如下代码走一边哈。




  1. public class Solution {
  2.     public boolean wordBreak(String s, Set<String> wordDict) {
  3.         boolean[] result = new boolean[s.length() + 1];
  4.         result[0] = true;
  5.         
  6.         for(int i = 0 ; i < s.length(); i++)
  7.         {
  8.             if(!result[i])
  9.             {
  10.                 continue;
  11.             }
  12.             for(String word : wordDict)
  13.             {
  14.                 int length = word.length();
  15.                 int end = i + length;
  16.                
  17.                 if(end > s.length())
  18.                 {
  19.                     continue;
  20.                 }
  21.                
  22.                 if(result[end])
  23.                 {
  24.                     continue;
  25.                 }
  26.                
  27.                 if(s.substring(i, end).equals(word))
  28.                 {
  29.                     result[end] = true;
  30.                 }
  31.             }
  32.         }
  33.         return result[s.length()];
  34.     }
  35. }
复制代码


回复

使用道具 举报

🔗
 楼主| love1point 2015-6-1 17:33:34 | 只看该作者
全局:
本帖最后由 love1point 于 2015-6-16 09:36 编辑

Anagrams:  https://leetcode.com/problems/anagrams/

觉得这题比较难,不看别人的答案的话 (6月1日我觉得这题比较难,6月15日,这种题我觉得比较简单了,因为自己理解了怎么做,这就是进步吧)

这题用到了HashMap。字符串是不能对里面的元素排序。我们只能将他们转化到数组才能用 Arrays.sort()进行排序。就是如下三行代码,记住它,以后会常用到。这道题其实和如下这题很像(http://www.lintcode.com/en/problem/two-strings-are-anagrams/),只不过lintcode这题更简单,只有两个字符串,而本题是有一个字符串数组。思路是一样的
            char[] arr = strs.toCharArray();
            Arrays.sort(arr);
            String t = String.valueOf(arr);

  1. public class Solution {
  2.     public ArrayList<String> anagrams(String[] strs) {
  3.         ArrayList<String> result = new ArrayList<String>();
  4.         
  5.         if(strs == null || strs.length == 0)
  6.         {
  7.             return result;
  8.         }
  9.         
  10.         HashMap<String, ArrayList<Integer>> map = new HashMap<String, ArrayList<Integer>>();
  11.         
  12.         for(int i = 0; i<strs.length; i++)
  13.         {
  14.             char[] arr = strs.toCharArray();
  15.             Arrays.sort(arr);
  16.             String t = String.valueOf(arr);
  17.             if(map.get(t) == null)
  18.             {
  19.                 ArrayList<Integer> l = new ArrayList<Integer>();
  20.                 l.add(i);
  21.                 map.put(t,l);
  22.             }
  23.             else
  24.             {
  25.                 map.get(t).add(i);
  26.             }
  27.         }
  28.         
  29.         for(ArrayList<Integer> l : map.values())
  30.         {
  31.             if(l.size() > 1)
  32.             {
  33.                 for(Integer i : l)
  34.                 {
  35.                     result.add(strs);
  36.                 }
  37.             }
  38.         }
  39.         return result;
  40.     }
  41. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表