
#What is the big-o of this? -> O(N**2)
def areAnagrams(s1, s2):
if(len(s1) != len(s2)): return False #O(1)
for c in s1: # N times
if(s1.count(c) != s2.count(c)): return False #O(N)
return True
import string
#What is the big-o of this? -> O(N)
def betterAreAnagrams(s1, s2):
d1 = {}
d2 = {}
for c in string.ascii_lowercase: # 26 times -> 1 time
d1[c] = s1.count(c) # O(N)
d2[c] = s2.count(c) # O(N)
return d1 == d2 #O(1)
#########################################################
def factorial(n):
if(n <= 1):
return 1
else:
# n > 1
return n * factorial(n-1)
#########################################################
def isEvenHeavy(n):
odd, even = isEvenHeavyHelper(n, True)
return even > odd
def isEvenHeavyHelper(n, evenIndex):
if(n == 0):
return (0, 0)
else:
digit = n%10
(oddSum, evenSum) = isEvenHeavyHelper(n//10, not evenIndex)
if(evenIndex):
return (oddSum, evenSum + digit)
else:
return (oddSum + digit, evenSum)
#########################################################
def isEvenHeavy(n):
odd, even = isEvenHeavyHelper(n)
return even > odd
def isEvenHeavyHelper(n):
if(n == 0):
return (0, 0)
else:
oddDig, evenDig = (n//10)%10, n%10
oddSum, evenSum = isEvenHeavyHelper(n//100)
return (oddSum + oddDig, evenSum + evenDig)Efficiency

Sorting
Recursion