|
1 | | -Leetcode |
2 | | -=== |
3 | | - |
4 | | -This is my solution to Leetcode Online Judge's problems. Currently I am revamping the problems all over again towards more idiomatic Python. Stay tuned for updates. |
| 1 | +This project is no longer maintained here. |
5 | 2 |
|
6 | | -Feel free to submit pull requests for submitting more elegant solution. |
7 | | - |
8 | | -###List of idiomatic Python I prefer (as of now) |
9 | | ---- |
10 | | -- Prefer list comprehension over map / filter. |
11 | | -``` |
12 | | - # from Gray Code |
13 | | -
|
14 | | - # Bad |
15 | | - def grayCode(self, n): |
16 | | - return map(lambda x: (x / 2) ^ x, range(1 << n)) |
17 | | -
|
18 | | - # Idiomatic |
19 | | - def grayCode(self, n): |
20 | | - return [(x / 2) ^ x for x in range(1 << n)] |
21 | | -``` |
22 | | -- Prefer using `in` keyword over repetitive variable in conditional statement. |
23 | | -``` |
24 | | - # from Post Order Traversal |
25 | | -
|
26 | | - # Bad |
27 | | - if parent.right == None or parent.right == prev |
28 | | -
|
29 | | - # Idiomatic |
30 | | - if parent.right in (None, prev): |
31 | | -``` |
32 | | -- Prefer using docstring over single line comment when describing functionality of a method. |
33 | | -``` |
34 | | - # from Search Insert Position |
35 | | -
|
36 | | - # Bad |
37 | | - # Iterative solution is also fine. |
38 | | - def searchInsert(self, A, target): |
39 | | -
|
40 | | - # Idiomatic |
41 | | - def searchInsert(self, A, target): |
42 | | - """Iterative solution is also fine. |
43 | | - """ |
44 | | -``` |
45 | | -- Prefer implicit evaluation of condition (e.g. `if`, `while`, etc.) over explicit comparison in condition. |
46 | | -Notice empty list and dictionary will be evaluated to False, so that is very handy. |
47 | | -``` |
48 | | - # from Binary Tree Preorder Traversal |
49 | | -
|
50 | | - # Bad |
51 | | - while len(stack) > 0: |
52 | | - current = stack.pop() |
53 | | -
|
54 | | - # Idiomatic |
55 | | - while stack: |
56 | | - current = stack.pop() |
57 | | -``` |
58 | | -- Prefer `is None` over `== None`. Notice `is` looks for referential equality, and `None` is a singleton. |
59 | | -The fundamental reason for this preference is much improved speed, and `==` can be overriden by `__eq__`. |
60 | | -``` |
61 | | - # from Binary Tree Preorder Traversal |
62 | | -
|
63 | | - # Bad |
64 | | - if root == None: |
65 | | -
|
66 | | - # Idiomatic |
67 | | - if root is None: |
68 | | -``` |
69 | | -One interesting side note in Python regarding this is on [Stackoverflow](http://stackoverflow.com/questions/306313/python-is-operator-behaves-unexpectedly-with-integers/306347). Trust me, that is worth your 60 seconds of time. But that only works in REPL though, not on a executable python file. |
70 | | - |
71 | | -READ THIS or above two rules will only do you harm: |
72 | | -Sometimes you have to use `if foo is not None` over `if foo`. For example, if foo is 0, then `if foo` will become False. But 0 is not None. Just watch out. A rule of the thumb is if you want to check if the default argument of a function is None, then use `if foo is not None`, otherwise you can most likely use `if foo` if you know what you are doing. |
73 | | -- Consider using enumerate when index accessing looks verbose |
74 | | -``` |
75 | | - # from Two Sum |
76 | | -
|
77 | | - # Bad |
78 | | - for i in range(len(nums)): |
79 | | - if target - nums[i] in lookup: |
80 | | - return (lookup[target - nums[i]] + 1, i + 1) |
81 | | - lookup[nums[i]] = i |
82 | | -
|
83 | | - # Idiomatic |
84 | | - for i, num in enumerate(nums): |
85 | | - if target - num in lookup: |
86 | | - return (lookup[target - num] + 1, i + 1) |
87 | | - lookup[num] = i |
88 | | -``` |
89 | | -- Readability counts. |
90 | | - |
91 | | - "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." Martin Fowler is right. |
92 | | -``` |
93 | | - # from Edit Distance |
94 | | -
|
95 | | - # Bad |
96 | | - def minDistance(self, word1, word2): |
97 | | - distance = [[i] for i in range(len(word1) + 1)] |
98 | | - distance[0] = [i for i in range(len(word2) + 1)] |
99 | | - for i in range(1, len(word1) + 1): |
100 | | - for j in range(1, len(word2) + 1): |
101 | | - distance[i].append(min(distance[i - 1][j] + 1, distance[i][j - 1] + 1, distance[i - 1][j - 1] + (word1[i - 1] != word2[j - 1]))) |
102 | | - return distance[-1][-1] |
103 | | -
|
104 | | - # Idiomatic |
105 | | - def minDistance(self, word1, word2): |
106 | | - distance = [[i] for i in range(len(word1) + 1)] |
107 | | - distance[0] = [i for i in range(len(word2) + 1)] |
108 | | - for i in range(1, len(word1) + 1): |
109 | | - for j in range(1, len(word2) + 1): |
110 | | - deletion = distance[i - 1][j] + 1 |
111 | | - addition = distance[i][j - 1] + 1 |
112 | | - substitution = distance[i - 1][j - 1] |
113 | | - if word1[i - 1] != word2[j - 1]: |
114 | | - substitution += 1 |
115 | | - distance[i].append(min(deletion, addition, substitution)) |
116 | | - return distance[-1][-1] |
| 3 | +Please go to https://github.com/jw2013/Leetcode-Py for latest update and for making pull request. Thanks! |
0 commit comments