# Leetcode ## Python tips: The following evaluates to `False` when used in `if` statements: - `0`, `False`, `None`, `[]`, `''` Other tips: ```python # Null (in C: NULL or 0, in C++ 11: nullptr) a = None # Loops for i in range(50): pass while condition: pass # Sorting a.sort() a.sort(key=lambda x:x[1]) a.sort(key=lambda x:x[1], reverse=True) sorted(a) # returns a copy # Reverse a.reverse() reversed(a) # returns a copy # convert string in base n to int int("0101001", 2) # Power 5.2e3 == 5200 # as a constant a ** 3 # power import math math.pow(a, 3) # same as a ** 3 # Set a = set() a.add(1) a.add(2) a.add(3) a.remove(1) if 2 in a: print('2 is in a') print('here are some things in a') for i in a: print(i) # Increment i += 1 # i++ is not allowed # List a = [1, 2] a.append(3) a.append(4) for i in range(len(a)): print(a[i]) # loop index for i in range(1, len(a)): print(a[i]) # loop starting from 1 for x in a: print(x) # loop element for i in range(len(a) - 1, -1, -1): # range(start, stop, step) print(a[i]) # loop index backward a.insert(index, element) # List comprehension a = [i for i in range(5)] # [0, 1, 2, 3, 4] a = [[0 for j in range(2)] for i in range(2)] # [[0, 0], [0, 0]] a = [0] * 5 #[0, 0, 0, 0, 0] a = {i: i*2 for i in range(5)} # Slicing # (This also works for strings and tuples) a = [1, 2, 3, 4] a[2:] # [3, 4] a[:2] # [1, 2] a[1:3] # [2, 3] a[-1] # 4 a[::-1] # return reversed copy #priority queue >>> h = [] >>> heappush(h, (5, 'write code')) >>> heappush(h, (7, 'release product')) >>> heappush(h, (1, 'write spec')) >>> heappush(h, (3, 'create tests')) >>> heappop(h) (1, 'write spec') heapq.nlargest(n, iterable[, key]) heapq.nsmallest(n, iterable[, key]) # Tuple a = (1, 2) b, c = a # b = 1, c = 2 # tuples are immutable # a[1] = 5 is NOT allowed # Ternary operator a if condition else b # Fraction (rational number) from fractions import Fraction # Python 2 a = Fraction(2, 3) # numerator, denominator a + 5 # support arithmetics a < 5 # support comparison a.numerator, a.denominator # access # deep copy from copy import deepcopy a = [[0, 1], [2, 3]] b = deepcopy(a) a[0][1] = 4 b[0][1] # 1 # split and join a = "a b c" b = a.split()# split by space return list. can split(",") string_name.join(iterable) #string name is the join thing(like - , ""), iterable is something like list "".join(b) #abc a = {} b = [] del a[key] del b[index] b.remove(value) #doesn't return anything b.pop(index) #return value #list concatenating list_a = [1, 2, 3, 4] list_b = [5, 6, 7, 8] list_c = list_a + lis_b print list_c # Output: [1, 2, 3, 4, 5, 6, 7, 8] # Queue from queue import Queue q = Queue() q.put(1) q.put(2) q.get() # 1 q.get() # 2 q.empty() # True # counter collection.Counter() # create map with for loop in side ind = {c: i for i, c in enumerate(order)} ``` Library && function ```python string_name.isalnum() # checks whether all the characters in a # given string is alphanumeric or not string.lower() string.upper() float('-inf') float('inf')) binary = int("0101",2) bin(binary) # convert back to string with 0b string.zfill(len) #adds zeros (0) at the beginning of the string, # until it reaches the specified length. ``` ## Problems ### Two sum (#1) Given an array of integers, return indices of the two numbers such that they add up to a specific target. ```python class Solution(object): def twoSum(self, nums, target): if len(nums) <= 1: return False buff_dict = {} for i in range(len(nums)): if nums[i] in buff_dict: return [buff_dict[nums[i]], i] else: buff_dict[target - nums[i]] = i ``` ### Add two numbers (#2) Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = 807. ```python class Solution: # @return a ListNode def addTwoNumbers(self, l1, l2): carry = 0 root = n = ListNode(0) while l1 or l2 or carry: v1 = v2 = 0 if l1: v1 = l1.val l1 = l1.next if l2: v2 = l2.val l2 = l2.next carry, val = divmod(v1+v2+carry, 10) n.next = ListNode(val) n = n.next return root.next ``` ### Longest Substring Without Repeating Characters (#3) Input: "pwwkew" Output: 3 Explanation: The answer is "wke", with the length of 3. ```python class Solution: # @return an integer def lengthOfLongestSubstring(self, s): start = maxLength = 0 usedChar = {} for i in range(len(s)): if s[i] in usedChar and start <= usedChar[s[i]]: start = usedChar[s[i]] + 1 else: maxLength = max(maxLength, i - start + 1) usedChar[s[i]] = i return maxLength ``` ### Median of two sorted arrays (#4) nums1 = [1, 2] nums2 = [3, 4] The median is (2 + 3)/2 = 2.5 ```python def median(A, B): m, n = len(A), len(B) if m > n: A, B, m, n = B, A, n, m if n == 0: raise ValueError imin, imax, half_len = 0, m, (m + n + 1) / 2 while imin <= imax: i = (imin + imax) / 2 j = half_len - i if i < m and B[j-1] > A[i]: # i is too small, must increase it imin = i + 1 elif i > 0 and A[i-1] > B[j]: # i is too big, must decrease it imax = i - 1 else: # i is perfect if i == 0: max_of_left = B[j-1] elif j == 0: max_of_left = A[i-1] else: max_of_left = max(A[i-1], B[j-1]) if (m + n) % 2 == 1: return max_of_left if i == m: min_of_right = B[j] elif j == n: min_of_right = A[i] else: min_of_right = min(A[i], B[j]) return (max_of_left + min_of_right) / 2.0 ``` ### ZigZag conversion Input: s = "PAYPALISHIRING", numRows = 3 Output: "PAHNAPLSIIGYIR" ```python class Solution(object): def convert(self, s, numRows): """ :type s: str :type numRows: int :rtype: str """ if numRows == 1 or numRows >= len(s): return s L = [''] * numRows index, step = 0, 1 for x in s: L[index] += x if index == 0: step = 1 elif index == numRows -1: step = -1 index += step return ''.join(L) ``` Tips: ```python L = [''] * numRows # ['','',''] if numRows = 3 ''.join(L) ``` ### Reverse Integer Input: -123 Output: -321 ```python def reverse(self, x): s = cmp(x, 0) r = int(`s*x`[::-1]) return s*r * (r < 2**31) ``` Tips: ```python r = int(`s*x`[::-1]) s = cmp(x, 0) #cmp(a,b) a<b return -1, = return 0, > return 1 ``` ### String to Integer (atoi) ```python class Solution(object): def myAtoi(self, s): """ :type str: str :rtype: int """ ###better to do strip before sanity check (although 8ms slower): #ls = list(s.strip()) #if len(ls) == 0 : return 0 if len(s) == 0 : return 0 ls = list(s.strip()) sign = -1 if ls[0] == '-' else 1 if ls[0] in ['-','+'] : del ls[0] ret, i = 0, 0 while i < len(ls) and ls[i].isdigit() : ret = ret*10 + ord(ls[i]) - ord('0') i += 1 return max(-2**31, min(sign * ret,2**31-1)) ``` Tips: ```python s.strip() #remove the leading and trailing whitespaces s.replace(" ","") #remve all whitesspaces del ls[0] # delete element from list and dict s.isdigit() #if the entire string is digit ord(ls[i]) #function returns the ASCII code of the character. chr(97) #function returns character represented by a ASCII number. == #can directly compare string using != >= <= ==.. ``` ### Container with most water (#11) ```python def maxArea(self, height): L, R, width, res = 0, len(height) - 1, len(height) - 1, 0 for w in range(width, 0, -1): if height[L] < height[R]: res, L = max(res, height[L] * w), L + 1 else: res, R = max(res, height[R] * w), R - 1 return res ``` ### Reverse Words in a String III (#557) ```python class Solution(object): def reverseWords(self, s): """ :type s: str :rtype: str """ a = s.split() b = map(lambda x: "".join(list(x)[::-1]), a) return " ".join(b) ``` Tips: ```python list(string) can split string to char list [::-1] reverse list ```