1.anagram查看两个数组是不是相同的字符组成
def anagram2(s1,s2):
# Remove spaces and lowercase letters
s1 = s1.replace(' ','').lower()
s2 = s2.replace(' ','').lower()
# Edge Case to check if same number of letters
if len(s1) != len(s2):
return False
# Create counting dictionary (Note could use DefaultDict from Collections module)
count = {}
# Fill dictionary for first string (add counts)
for letter in s1:
if letter in count:
count[letter] += 1
else:
count[letter] = 1
# Fill dictionary for second string (subtract counts)
for letter in s2:
if letter in count:
count[letter] -= 1
else:
count[letter] = 1
# Check that all counts are 0
for k in count:
if count[k] != 0:
return False
# Otherwise they're anagrams
return True
核心是通过字典来计算每个字母出现的字数。
2. array pair sum
输入:pair_sum([1,3,2,2],4) 输出: (1,3) (2,2)
def pair_sum(arr,k):
if len(arr)<2:
return
# Sets for tracking
seen = set()
output = set()
# For every number in array
for num in arr:
# Set target difference
target = k-num
# Add it to set if target hasn't been seen
if target not in seen:
seen.add(num)
else:
# Add a tuple with the corresponding pair
output.add( (min(num,target), max(num,target)) )
# FOR TESTING
return len(output)
# Nice one-liner for printing output
#return '\n'.join(map(str,list(output)))
核心是通过set元素不重复的原则来避免出现重复的组合。
3.find the missing element
O(NlogN):
def finder(arr1,arr2):
# Sort the arrays
arr1.sort()
arr2.sort()
# Compare elements in the sorted arrays
for num1, num2 in zip(arr1,arr2):
if num1!= num2:
return num1
# Otherwise return last element
return arr1[-1]
O(N):
import collections
def finder2(arr1, arr2):
# Using default dict to avoid key errors
d=collections.defaultdict(int)
# Add a count for every instance in Array 1
for num in arr2:
d[num]+=1
# Check if num not in dictionary
for num in arr1:
if d[num]==0:
return num
# Otherwise, subtract a count
else: d[num]-=1
4.Setence Reversal 把字符串反转过来
def rev_word3(s):
"""
Manually doing the splits on the spaces.
"""
words = []
length = len(s)
spaces = [' ']
# Index Tracker
i = 0
# While index is less than length of string
while i < length:
# If element isn't a space
if s[i] not in spaces:
# The word starts at this index
word_start = i
while i < length and s[i] not in spaces:
# Get index where word ends
i += 1
# Append that word to the list
words.append(s[word_start:i])
# Add to index
i += 1
# Join the reversed words
return " ".join(reversed(words))
5.String compression 把相同的字母用个数代替
compress('AAAAABBBBCCCC')
output:
'A5B4C4'
def compress(s): """ This solution compresses without checking. Known as the RunLength Compression algorithm. """ # Begin Run as empty string r = "" l = len(s) # Check for length 0 if l == 0: return "" # Check for length 1 if l == 1: return s + "1" #Intialize Values last = s[0] cnt = 1 i = 1 while i < l: # Check to see if it is the same letter if s[i] == s[i - 1]: # Add a count if same as previous cnt += 1 else: # Otherwise store the previous data r = r + s[i - 1] + str(cnt) cnt = 1 # Add to index count to terminate while loop i += 1 # Put everything back into run r = r + s[i - 1] + str(cnt) return r