mirror of
https://github.com/autistic-symposium/master-algorithms-py.git
synced 2025-04-29 20:26:07 -04:00
interview problems
This commit is contained in:
parent
0f559fa0d7
commit
fda02ef3c8
35
src/extra_interview_problems/bitwise/clear_bits.py
Executable file
35
src/extra_interview_problems/bitwise/clear_bits.py
Executable file
@ -0,0 +1,35 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
''' Clear a bit in a binary number.
|
||||
Like the reverse of set bit:
|
||||
1) first create a number filled of 1s,
|
||||
with 0 at i (can create 0001000 and ~)
|
||||
2) AND the number so it clears the ith bit
|
||||
'''
|
||||
|
||||
|
||||
|
||||
def clear_bit(num, i):
|
||||
mask = ~ (1 << i) # -0b10001
|
||||
return bin(num & mask)
|
||||
|
||||
|
||||
def clear_all_bits_from_i_to_0(num, i):
|
||||
mask = ~ ( (1 << (i+1)) - 1)
|
||||
return bin(num & mask)
|
||||
|
||||
|
||||
def clear_all_bits_from_most_sig_to_1(num, i):
|
||||
mask = ( 1 << i) -1
|
||||
return bin(num & mask)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
num = int('10010000', 2)
|
||||
print clear_bit(num, 4) # '0b10000000'
|
||||
|
||||
num = int('10010011', 2)
|
||||
print clear_all_bits_from_i_to_0(num, 2) # '0b10010000'
|
||||
|
||||
num = int('1110011', 2)
|
||||
print clear_all_bits_from_most_sig_to_1(num, 2) #'0b11'
|
23
src/extra_interview_problems/bitwise/find_bit_len.py
Executable file
23
src/extra_interview_problems/bitwise/find_bit_len.py
Executable file
@ -0,0 +1,23 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
''' Find how many bits a int has:
|
||||
1) Start with a mask of 1
|
||||
2) Mask with AND
|
||||
3) if result (if true): count += 1
|
||||
(obs: to find the int of a bin do int('1001', 2)) and to show in bin do bin(int))
|
||||
'''
|
||||
|
||||
|
||||
def find_bit_len(int_num):
|
||||
lenght = 0
|
||||
while int_num:
|
||||
int_num >>= 1
|
||||
lenght += 1
|
||||
return lenght
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
for i in range(17):
|
||||
print(find_bit_len(i))
|
||||
print i.bit_length()
|
||||
print
|
25
src/extra_interview_problems/bitwise/get_bit.py
Executable file
25
src/extra_interview_problems/bitwise/get_bit.py
Executable file
@ -0,0 +1,25 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
''' Get a bit in a binary number:
|
||||
1) Shifts 1 over by i bits
|
||||
2) make an AND with the number
|
||||
3) all the other than the bit at i are clean, now compare to 0
|
||||
4) if the new value is not 0, bit i is 1
|
||||
'''
|
||||
|
||||
|
||||
def get_bit(num, i):
|
||||
mask = 1 << i
|
||||
return num & mask != 0
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
num = int('0100100', 2)
|
||||
get_bit(num, 0) # 0
|
||||
get_bit(num, 1) # 0
|
||||
get_bit(num, 2) # 1
|
||||
get_bit(num, 3) # 0
|
||||
get_bit(num, 4) # 0
|
||||
get_bit(num, 5) # 1
|
||||
get_bit(num, 6) # 0
|
||||
|
37
src/extra_interview_problems/bitwise/num_bits_to_convert_2_nums.py
Executable file
37
src/extra_interview_problems/bitwise/num_bits_to_convert_2_nums.py
Executable file
@ -0,0 +1,37 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
''' This method returns the number of bits that are necessary to change to convert two
|
||||
numbers A and B:
|
||||
1) XOR
|
||||
2) count 1s
|
||||
'''
|
||||
|
||||
def count_bits_swap2(a, b):
|
||||
count = 0
|
||||
m = a^b
|
||||
while m:
|
||||
count +=1
|
||||
m = m & (m-1)
|
||||
return count
|
||||
|
||||
|
||||
|
||||
def count_bits_swap(a, b):
|
||||
m = a^b
|
||||
return count_1s(m)
|
||||
|
||||
|
||||
def count_1s(m):
|
||||
count = 0
|
||||
while m:
|
||||
if m& 1 :
|
||||
count +=1
|
||||
m >>= 1
|
||||
return count
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
a = int('10010000', 2)
|
||||
b = int('01011010', 2)
|
||||
print count_bits_swap(a, b) #4
|
||||
print count_bits_swap2(a, b) #4
|
25
src/extra_interview_problems/bitwise/set_bit.py
Executable file
25
src/extra_interview_problems/bitwise/set_bit.py
Executable file
@ -0,0 +1,25 @@
|
||||
#!/usr/bin/python
|
||||
''' Set a bit in a binary number:
|
||||
1) Shifts 1 over by i bits
|
||||
2) make an OR with the number, only the value at bit i will change and all the others bit
|
||||
of the mask are zero so will not affect the num
|
||||
|
||||
'''
|
||||
|
||||
|
||||
|
||||
def set_bit(num, i):
|
||||
mask = 1 << i
|
||||
return bin( num | mask )
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
num = int('0100100', 2)
|
||||
print set_bit(num, 0) #'0b100101'
|
||||
print set_bit(num, 1) #'0b100110'
|
||||
print set_bit(num, 2) # nothing change '0b100100'
|
||||
print set_bit(num, 3) #'0b101100'
|
||||
print set_bit(num, 4) #'0b110100'
|
||||
print set_bit(num, 5) # nothing change '0b100100'
|
20
src/extra_interview_problems/bitwise/update_bit.py
Executable file
20
src/extra_interview_problems/bitwise/update_bit.py
Executable file
@ -0,0 +1,20 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
''' This method merges set bit and clean bit:
|
||||
1) first clear the bit at i using a mask such as 1110111
|
||||
2) then shift the intended value v by i bits
|
||||
3) this will create a number with bit i to v and all other to 0
|
||||
4) finally update the ith bit with or
|
||||
'''
|
||||
|
||||
|
||||
|
||||
def update_bit(num, i, v):
|
||||
mask = ~ (1 << i)
|
||||
return bin( (num & mask) | (v << i) )
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
num = int('10010000', 2)
|
||||
print update_bit(num, 2, 1) # '0b10010100'
|
||||
|
@ -0,0 +1,5 @@
|
||||
Given an english word in the form of a string, how can you quickly find all valid anagrams for that string?
|
||||
|
||||
First you go through each word in the dictionary, sort the letters of the word and use this as a key in a Hash Table. O(nln n).
|
||||
|
||||
The O(1) lookup is sorting the query word and searching for the key.
|
6
src/extra_interview_problems/math_arrays_and_strings/balance.txt
Executable file
6
src/extra_interview_problems/math_arrays_and_strings/balance.txt
Executable file
@ -0,0 +1,6 @@
|
||||
This is the classic "you have 8 balls/coins, which are the same weight, except for one which is slightly heavier than the others. You also have an old-style balance. What is the fewest number of weighings to find the heavy coin/ball?
|
||||
|
||||
Answer: 2! You need to use every information available:
|
||||
Weight 3 x 3 balls/coins.
|
||||
If they weight the same: weight the 2 balls/coins left outside.
|
||||
Else, measure 2 of the 3 heavier balls/coins.
|
@ -0,0 +1,54 @@
|
||||
#!/bin/python
|
||||
|
||||
|
||||
"""
|
||||
Given an integer x and an unsorted array of integers, describe an algorithm to
|
||||
determine whether two of the numbers add up to x.
|
||||
|
||||
1. Using hash tables.
|
||||
2. Sorting the array and keeping two pointers in the array, one in the beginning and
|
||||
one in the end. Whenever the sum of the current two integers is less than x, move the
|
||||
first pointer forwards, and whenever the sum is greater than x, move the second pointer
|
||||
backwards. O(nln n).
|
||||
3. Create a BST with x minus each element in the array. Check whether any element of
|
||||
the array appears in the BST. It takes O(nlog n) times two.
|
||||
"""
|
||||
|
||||
|
||||
def check_if_sum(arr, num):
|
||||
seq = sorted(arr)
|
||||
p1, p2 = 0, len(arr) - 1
|
||||
while p1 < p2 and p2 < len(arr) and p1 >= 0:
|
||||
sum_here = seq[p1] + seq[p2]
|
||||
if sum_here == num:
|
||||
return True, seq[p1], seq[p2]
|
||||
elif sum_here < num:
|
||||
p1 += 1
|
||||
elif sum_here > num:
|
||||
p2 -= 1
|
||||
return False
|
||||
|
||||
|
||||
from collections import Counter
|
||||
def check_if_sum2(arr, num):
|
||||
d = Counter()
|
||||
for i in arr:
|
||||
d[i] += 1
|
||||
|
||||
for i in arr:
|
||||
other = num - i
|
||||
d[i] -= 1
|
||||
if d[other] == 1:
|
||||
return True, other, i
|
||||
return False
|
||||
|
||||
|
||||
arr = [3, 1, 13, 7, 2, 10]
|
||||
num1 = 11
|
||||
num2 = 6
|
||||
|
||||
print(check_if_sum(arr, num1))
|
||||
print(check_if_sum(arr, num2))
|
||||
print
|
||||
print(check_if_sum2(arr, num1))
|
||||
print(check_if_sum2(arr, num2))
|
53
src/extra_interview_problems/math_arrays_and_strings/check_if_anagrams.py
Executable file
53
src/extra_interview_problems/math_arrays_and_strings/check_if_anagrams.py
Executable file
@ -0,0 +1,53 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
""" find whether two words are anagrams. Since sets do not count occurency, and sorting is O(nlogn)
|
||||
we will use hash tables. We scan the first string and add all the character occurences. Then we
|
||||
scan the second tring and decrease all the caracther occurences. If all the counts are zero, it is
|
||||
an anagram"""
|
||||
|
||||
import string
|
||||
|
||||
|
||||
def verify_two_strings_are_anagrams(str1, str2):
|
||||
ana_table = {key:0 for key in string.ascii_lowercase}
|
||||
|
||||
for i in str1:
|
||||
ana_table[i] += 1
|
||||
|
||||
for i in str2:
|
||||
ana_table[i] -= 1
|
||||
|
||||
if len(set(ana_table.values())) < 2: return True
|
||||
else: return False
|
||||
|
||||
|
||||
|
||||
|
||||
''' verify if words are anagrams by comparying hash functions'''
|
||||
|
||||
def hash_func(astring, tablesize):
|
||||
sump = 0
|
||||
for p in astring:
|
||||
sump += ord(p)
|
||||
return sump%tablesize
|
||||
|
||||
|
||||
def find_anagram_hash_function(word1, word2):
|
||||
tablesize = 11
|
||||
return hash_func(word1, tablesize) == hash_func(word2, tablesize)
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
str1 = 'marina'
|
||||
str2 = 'aniram'
|
||||
str3 = 'anfaam'
|
||||
|
||||
print verify_two_strings_are_anagrams(str1, str2)
|
||||
print verify_two_strings_are_anagrams(str1, str3)
|
||||
print
|
||||
print find_anagram_hash_function(str1, str2)
|
||||
print find_anagram_hash_function(str1, str3)
|
||||
|
||||
|
@ -0,0 +1,38 @@
|
||||
#!/bin/python
|
||||
|
||||
''' Check if palindrome'''
|
||||
|
||||
|
||||
def check_pal(string):
|
||||
string = "".join(string.split(' '))
|
||||
p1, p2 = 0, len(string)-1
|
||||
pal = True
|
||||
while p1 < p2:
|
||||
if string[p1] != string[p2]:
|
||||
pal = False
|
||||
break
|
||||
p1+=1
|
||||
p2-=1
|
||||
return pal
|
||||
|
||||
|
||||
def check_pal2(string):
|
||||
string = "".join(string.split(' '))
|
||||
if len(string)<2:
|
||||
return True
|
||||
if string[0] != string[-1]:
|
||||
return False
|
||||
return check_pal2(string[1:-1])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
string1 = "borrow or rob"
|
||||
string2 = " draw ward"
|
||||
string3 = "google is fun"
|
||||
print(check_pal(string1))
|
||||
print(check_pal(string2))
|
||||
print(check_pal(string3))
|
||||
print
|
||||
print(check_pal2(string1))
|
||||
print(check_pal2(string2))
|
||||
print(check_pal2(string3))
|
@ -0,0 +1,23 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
''' find and delete all the duplicate characters in a string '''
|
||||
|
||||
|
||||
import string
|
||||
|
||||
def delete_unique_word(str1):
|
||||
table_c = { key : 0 for key in string.ascii_lowercase}
|
||||
for i in str1:
|
||||
table_c[i] += 1
|
||||
for key, value in table_c.items():
|
||||
if value > 1:
|
||||
str1 = str1.replace(key, "")
|
||||
|
||||
return str1
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
str1 = "google"
|
||||
print delete_unique_word(str1) # == 'le'
|
||||
|
21
src/extra_interview_problems/math_arrays_and_strings/fibonacci.py
Executable file
21
src/extra_interview_problems/math_arrays_and_strings/fibonacci.py
Executable file
@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
|
||||
__author__ = "Mari Wahl"
|
||||
__email__ = "marina.w4hl@gmail.com"
|
||||
|
||||
''' understanding generators'''
|
||||
|
||||
def fib_generator():
|
||||
a, b = 0, 1
|
||||
while True:
|
||||
yield b
|
||||
a, b = b, a+b
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
fib = fib_generator()
|
||||
print(next(fib))
|
||||
print(next(fib))
|
||||
print(next(fib))
|
||||
print(next(fib))
|
@ -0,0 +1,81 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
|
||||
def find_permutations(s):
|
||||
if len(s) < 2: return s
|
||||
res = []
|
||||
for i, c in enumerate(s):
|
||||
for perm in find_permutations(s[:i] + s[i+1:]):
|
||||
res.append(c + "".join(perm))
|
||||
return res
|
||||
|
||||
|
||||
def fpc(s):
|
||||
return [s] if len(s)<2 else [c+p for i,c in enumerate(s) for p in fpc(s[:i]+s[i+1:])]
|
||||
|
||||
|
||||
def find_permutations_stdlib(s):
|
||||
from itertools import permutations
|
||||
return [''.join(p) for p in permutations(s)]
|
||||
|
||||
|
||||
def find_permutations2(s):
|
||||
if len(s) < 2: return s
|
||||
res = []
|
||||
for i in range(len(s)):
|
||||
for perm in find_permutations2(s[:i] + s[i+1:]):
|
||||
res.append(s[i] + perm)
|
||||
return res
|
||||
|
||||
|
||||
def verify_if_perm(s1, s2):
|
||||
if len(s1) != len(s2): return False
|
||||
s1 = sorted(s1)
|
||||
s2 = sorted(s2)
|
||||
return s1 == s2
|
||||
|
||||
|
||||
from collections import Counter
|
||||
def verify_if_perm2(s1, s2): # like anagram
|
||||
if len(s1) != len(s2): return False
|
||||
dict_aux = Counter()
|
||||
for c in s1:
|
||||
dict_aux[c] += 1
|
||||
for c in s2:
|
||||
dict_aux[c] -= 1
|
||||
for item in dict_aux:
|
||||
if dict_aux[item]:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
s1 = 'ufyfbufyfb'
|
||||
s2 = 'buffybuffy'
|
||||
s3 = 'uuyfbuuyfb'
|
||||
s4 = ''
|
||||
|
||||
print(verify_if_perm(s1, s2))
|
||||
print(verify_if_perm(s1, s3))
|
||||
print(verify_if_perm(s1, s4))
|
||||
print
|
||||
print(verify_if_perm2(s1, s2))
|
||||
print(verify_if_perm2(s1, s3))
|
||||
print(verify_if_perm2(s1, s4))
|
||||
|
||||
print
|
||||
|
||||
s = 'hat'
|
||||
print find_permutations(s)
|
||||
print fpc(s)
|
||||
print find_permutations_stdlib(s)
|
||||
print find_permutations2(s)
|
||||
print
|
||||
print find_permutations(s4)
|
||||
print fpc(s4)
|
||||
print find_permutations_stdlib(s4)
|
||||
print find_permutations2(s4)
|
||||
|
||||
|
||||
|
@ -0,0 +1,20 @@
|
||||
#!/usr/bin/python
|
||||
#
|
||||
''' give all the combinations of a str or list '''
|
||||
|
||||
|
||||
def comb_str(l1):
|
||||
if len(l1) < 2:
|
||||
return l1
|
||||
result = []
|
||||
for i, c in enumerate(l1):
|
||||
result.append(c)
|
||||
for comb in comb_str(l1[i+1:]):
|
||||
result.append(c + "".join(comb))
|
||||
return result
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
l1 = ['a', 'b', 'c']
|
||||
print comb_str(l1)
|
31
src/extra_interview_problems/math_arrays_and_strings/find_if_is_substr.py
Executable file
31
src/extra_interview_problems/math_arrays_and_strings/find_if_is_substr.py
Executable file
@ -0,0 +1,31 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
def isSubstr(s1, s2):
|
||||
if s1 in s2 or s2 in s1: return True
|
||||
return False
|
||||
|
||||
|
||||
def find_substr(s1, s2):
|
||||
pl, ps = 0, 0
|
||||
if len(s1) > len(s2):
|
||||
larger, smaller = s1, s2
|
||||
else:
|
||||
larger, smaller = s2, s1
|
||||
while ps < len(smaller) and pl < len(larger):
|
||||
if larger[pl] == smaller[ps]:
|
||||
ps += 1
|
||||
else:
|
||||
ps = 0
|
||||
pl += 1
|
||||
if ps == len(smaller):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
s1 = 'buffy is a vampire slayer'
|
||||
s2 = 'vampire'
|
||||
s3 = 'angel'
|
||||
print find_substr(s2, s1)
|
||||
print find_substr(s3, s1)
|
@ -0,0 +1,45 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
from collections import defaultdict
|
||||
|
||||
|
||||
def find_unique_number(arr):
|
||||
table = defaultdict(int)
|
||||
total = 0
|
||||
for i in arr:
|
||||
if table[i]:
|
||||
total -= i
|
||||
else:
|
||||
total += i
|
||||
table[i] +=1
|
||||
return total
|
||||
|
||||
|
||||
def find_unique_number_xor(arr):
|
||||
xor = 0
|
||||
for item in arr:
|
||||
xor ^= item
|
||||
return xor
|
||||
|
||||
|
||||
def find_unique_char(s):
|
||||
if len(s) < 2: return True
|
||||
for i, c in enumerate(s):
|
||||
for j in s[i+1:]:
|
||||
if j == c:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
arr = [1, 3, 5, 6, 1, 5, 6, 3, 7,]
|
||||
print(find_unique_number(arr))
|
||||
print(find_unique_number_xor(arr))
|
||||
s1 = 'abcdefg'
|
||||
s2 = 'buffy'
|
||||
s3 = ''
|
||||
print
|
||||
print(find_unique_char(s1))
|
||||
print(find_unique_char(s2))
|
||||
print(find_unique_char(s3))
|
26
src/extra_interview_problems/math_arrays_and_strings/finding_gcd.py
Executable file
26
src/extra_interview_problems/math_arrays_and_strings/finding_gcd.py
Executable file
@ -0,0 +1,26 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
|
||||
def finding_gcd(a, b):
|
||||
''' implements the greatest common divider algorithm '''
|
||||
while(b != 0):
|
||||
result = b
|
||||
a, b = b, a % b
|
||||
return result
|
||||
|
||||
|
||||
def test_finding_gcd():
|
||||
number1 = 21
|
||||
number2 = 12
|
||||
assert(finding_gcd(number1, number2) == 3)
|
||||
print('Tests passed!')
|
||||
|
||||
if __name__ == '__main__':
|
||||
test_finding_gcd()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
59
src/extra_interview_problems/math_arrays_and_strings/finding_if_prime.py
Executable file
59
src/extra_interview_problems/math_arrays_and_strings/finding_if_prime.py
Executable file
@ -0,0 +1,59 @@
|
||||
#!/usr/bin/python3
|
||||
# mari von steinkirch @2013
|
||||
# steinkirch at gmail
|
||||
|
||||
import math
|
||||
import random
|
||||
|
||||
def finding_prime(number):
|
||||
''' find whether a number is prime in a simple way'''
|
||||
num = abs(number)
|
||||
if num < 4 : return True
|
||||
for x in range(2, num):
|
||||
if num % x == 0:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def finding_prime_sqrt(number):
|
||||
''' find whether a number is prime as soon as it rejects all candidates up to sqrt(n) '''
|
||||
num = abs(number)
|
||||
if num < 4 : return True
|
||||
for x in range(2, int(math.sqrt(num)) + 1):
|
||||
if number % x == 0:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def finding_prime_fermat(number):
|
||||
''' find whether a number is prime with Fermat's theorem, using probabilistic tests '''
|
||||
if number <= 102:
|
||||
for a in range(2, number):
|
||||
if pow(a, number- 1, number) != 1:
|
||||
return False
|
||||
return True
|
||||
else:
|
||||
for i in range(100):
|
||||
a = random.randint(2, number - 1)
|
||||
if pow(a, number - 1, number) != 1:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
|
||||
def test_finding_prime():
|
||||
number1 = 17
|
||||
number2 = 20
|
||||
assert(finding_prime(number1) == True)
|
||||
assert(finding_prime(number2) == False)
|
||||
assert(finding_prime_sqrt(number1) == True)
|
||||
assert(finding_prime_sqrt(number2) == False)
|
||||
assert(finding_prime_fermat(number1) == True)
|
||||
assert(finding_prime_fermat(number2) == False)
|
||||
print('Tests passed!')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
test_finding_prime()
|
||||
|
||||
|
35
src/extra_interview_problems/math_arrays_and_strings/generate_prime.py
Executable file
35
src/extra_interview_problems/math_arrays_and_strings/generate_prime.py
Executable file
@ -0,0 +1,35 @@
|
||||
#!/usr/bin/python3
|
||||
# mari von steinkirch @2013
|
||||
# steinkirch at gmail
|
||||
|
||||
import math
|
||||
import random
|
||||
import sys
|
||||
from finding_prime import finding_prime_sqrt
|
||||
|
||||
|
||||
def generate_prime(number=3):
|
||||
''' return a n-bit prime '''
|
||||
while 1:
|
||||
p = random.randint(pow(2, number-2), pow(2, number-1)-1)
|
||||
p = 2 * p + 1
|
||||
if finding_prime_sqrt(p):
|
||||
return p
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) < 2:
|
||||
print ("Usage: generate_prime.py number")
|
||||
sys.exit()
|
||||
else:
|
||||
number = int(sys.argv[1])
|
||||
print(generate_prime(number))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
26
src/extra_interview_problems/math_arrays_and_strings/get_float_rep_bin.py
Executable file
26
src/extra_interview_problems/math_arrays_and_strings/get_float_rep_bin.py
Executable file
@ -0,0 +1,26 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
''' Given a real number between 0 and 1 (eg: 0.72), this method print the binary
|
||||
representation. If the Number cannot be represented accurately in binary, with at
|
||||
most 32 chars, print error:
|
||||
'''
|
||||
|
||||
def get_float_rep(num):
|
||||
if num >= 1 or num <= 0: return 'Error 1'
|
||||
result = '.'
|
||||
while num:
|
||||
if len(result) >= 32: return 'Error 2', result
|
||||
r = num*2
|
||||
if r >= 1:
|
||||
result += '1'
|
||||
num = r - 1
|
||||
else:
|
||||
result += '0'
|
||||
num = r
|
||||
return result
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print get_float_rep(0.72) #('Error 2', '.1011100001010001111010111000010')
|
||||
print get_float_rep(0.1) # ('Error 2', '.0001100110011001100110011001100')
|
||||
print get_float_rep(0.5) #'.1'
|
@ -0,0 +1,80 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
__author__ = "Mari Wahl"
|
||||
__email__ = "marina.w4hl@gmail.com"
|
||||
|
||||
|
||||
|
||||
''' using sets '''
|
||||
|
||||
def intersection_two_arrays_sets(seq1, seq2):
|
||||
''' find the intersection of two arrays using set proprieties '''
|
||||
set1 = set(seq1)
|
||||
set2 = set(seq2)
|
||||
return set1.intersection(set2) #same as list(set1 & set2
|
||||
|
||||
|
||||
|
||||
''' using merge sort '''
|
||||
|
||||
def intersection_two_arrays_ms(seq1, seq2):
|
||||
''' find the intersection of two arrays using merge sort '''
|
||||
res = []
|
||||
while seq1 and seq2:
|
||||
if seq1[-1] == seq2[-1]:
|
||||
res.append(seq1.pop())
|
||||
seq2.pop()
|
||||
elif seq1[-1] > seq2[-1]:
|
||||
seq1.pop()
|
||||
else:
|
||||
seq2.pop()
|
||||
res.reverse()
|
||||
return res
|
||||
|
||||
|
||||
|
||||
|
||||
''' using binary search '''
|
||||
|
||||
def binary_search(seq, key, lo=0, hi=None):
|
||||
''' binary search iterative algorithm '''
|
||||
hi = hi or len(seq)
|
||||
while lo < hi:
|
||||
mid = (hi+lo) // 2
|
||||
if seq[mid] == key:
|
||||
return True
|
||||
elif key > seq[mid]:
|
||||
lo = mid + 1
|
||||
else:
|
||||
hi = mid
|
||||
return None
|
||||
|
||||
def intersection_two_arrays_bs(seq1, seq2):
|
||||
''' if A small and B is too large, we can do a binary search on each entry in B '''
|
||||
''' only works if sorted and the small sequence has not larger nmbers!!!'''
|
||||
if len(seq1) > len(seq2): seq, key = seq1, seq2
|
||||
else: seq, key = seq2, seq1
|
||||
|
||||
intersec = []
|
||||
for item in key:
|
||||
if binary_search(seq, item):
|
||||
intersec.append(item)
|
||||
return intersec
|
||||
|
||||
|
||||
|
||||
def test_intersection_two_arrays(module_name='this module'):
|
||||
seq1 = [1,2,3,5,7,8]
|
||||
seq2 = [3,5,6]
|
||||
|
||||
assert(set(intersection_two_arrays_sets(seq1,seq2)) == set([3,5]))
|
||||
assert(intersection_two_arrays_bs(seq1,seq2) == [3,5])
|
||||
assert(intersection_two_arrays_ms(seq1,seq2) == [3,5])
|
||||
|
||||
s = 'Tests in {name} have {con}!'
|
||||
print(s.format(name=module_name, con='passed'))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
test_intersection_two_arrays()
|
||||
|
31
src/extra_interview_problems/math_arrays_and_strings/max_subarray_stocks.py
Executable file
31
src/extra_interview_problems/math_arrays_and_strings/max_subarray_stocks.py
Executable file
@ -0,0 +1,31 @@
|
||||
def beating_stock(array):
|
||||
|
||||
imin = 0
|
||||
i = 1
|
||||
deal = [array[i] - array[imin], imin, i]
|
||||
|
||||
while i < len(array):
|
||||
|
||||
deal_here = array[i] - array[imin]
|
||||
if deal_here > deal[0]:
|
||||
deal = [deal_here, imin, i]
|
||||
|
||||
elif array[i] < array[imin]:
|
||||
imin = i
|
||||
|
||||
i += 1
|
||||
|
||||
return deal[0], array[deal[1]], array[deal[2]]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
array = [7, 2, 3, 6, 5, 8, 5, 3, 4]
|
||||
print(array)
|
||||
print("The best profit is %d, buying at %d, selling at %d." %(beating_stock(array)))
|
@ -0,0 +1,9 @@
|
||||
How to know how many 0 are in 100!
|
||||
|
||||
You look for the primes that multiply to 10, i.e. 2 and 5.
|
||||
|
||||
There are more 5 than 2s so you can count the fives.
|
||||
|
||||
there is 100/5 = 20, so 20 5s. However, there are two 5s in 25, 50, 75 and 100.
|
||||
|
||||
result: 20+4 = 24
|
28
src/extra_interview_problems/math_arrays_and_strings/ransom_note.py
Executable file
28
src/extra_interview_problems/math_arrays_and_strings/ransom_note.py
Executable file
@ -0,0 +1,28 @@
|
||||
from collections import Counter
|
||||
|
||||
def check_if_ransom_note(magazines, note):
|
||||
count = Counter()
|
||||
pm, pn = 0, 0
|
||||
|
||||
while pn < len(note) and pm < len(magazines):
|
||||
char_note = note[pn]
|
||||
if count[char_note]>0:
|
||||
count[char_note] -= 1
|
||||
pn += 1
|
||||
else:
|
||||
char_magazine = magazines[pm]
|
||||
count[char_magazine] += 1
|
||||
pm +=1
|
||||
|
||||
return pn == len(note)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
magazines1 = "avfegthhgrebvkdsvnijnvyijfdmckdsmovkmmfvskumvl;cdkmioswckofjbkreenyukjemjgnmkmvkmnvdkmvkr g gmvdvmldm vldfkmbldkmlvdkm"
|
||||
magazines2 = "adfsfa"
|
||||
note = "you should disobey"
|
||||
|
||||
print(check_if_ransom_note(magazines1, note))
|
||||
print(check_if_ransom_note(magazines2, note))
|
@ -0,0 +1,12 @@
|
||||
#!/bin/python
|
||||
|
||||
''' Reverting a string '''
|
||||
|
||||
|
||||
def revert(string):
|
||||
return string[::-1]
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
string = "Google is fun!"
|
||||
print(revert(string))
|
@ -0,0 +1,43 @@
|
||||
#!/usr/bin python
|
||||
|
||||
|
||||
|
||||
def reversing_words_setence_py(s):
|
||||
words = s.split()
|
||||
return ' '.join(reversed(words))
|
||||
|
||||
def reversing_words_setence_py2(s):
|
||||
words = s.split(' ')
|
||||
words.reverse()
|
||||
return ' '.join(words)
|
||||
|
||||
def reversing_words_setence_py3(s):
|
||||
p1 = 0
|
||||
word = ''
|
||||
arr = []
|
||||
while p1 < len(s):
|
||||
if s[p1] != ' ':
|
||||
word += s[p1]
|
||||
else:
|
||||
arr.append(word)
|
||||
word = ''
|
||||
p1 += 1
|
||||
|
||||
arr.append(word)
|
||||
new = ''
|
||||
while arr:
|
||||
new += arr.pop()
|
||||
new += ' '
|
||||
|
||||
return new
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
s = "Buffy is a Vampire Slayer"
|
||||
print reversing_words_setence_py(s)
|
||||
print reversing_words_setence_py2(s)
|
||||
print reversing_words_setence_py3(s)
|
||||
|
||||
|
3
src/extra_interview_problems/sorting_and_searching/deck_shuffling.txt
Executable file
3
src/extra_interview_problems/sorting_and_searching/deck_shuffling.txt
Executable file
@ -0,0 +1,3 @@
|
||||
How to shuffle an array or a deck of cards so each shuffle has the same probability?
|
||||
|
||||
go thru the array shuffling each element with any random element after that.
|
@ -0,0 +1,17 @@
|
||||
#!/bin/python
|
||||
|
||||
''' Quick sort an array '''
|
||||
|
||||
|
||||
def quick_sort(arr):
|
||||
if len(arr) < 2: return arr
|
||||
piv = len(arr)//2
|
||||
left = [x for i, x in enumerate(arr) if x <= arr[piv] and i != piv]
|
||||
right = [x for i, x in enumerate(arr) if x > arr[piv] and i != piv]
|
||||
return quick_sort(left) + [arr[piv]] + quick_sort(right)
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
arr = [8, 5, 2, 6, 1, 2, 9, 4]
|
||||
print(quick_sort(arr))
|
24
src/useful_scripts/count_unique_words_files.py
Executable file
24
src/useful_scripts/count_unique_words_files.py
Executable file
@ -0,0 +1,24 @@
|
||||
#!/usr/bin/python
|
||||
import collections
|
||||
import string
|
||||
import sys
|
||||
|
||||
def count_unique_word_file():
|
||||
if len(sys.argv) < 2:
|
||||
print "Usage: python count_unique_word.py NAMEFILE"
|
||||
|
||||
words = collections.defaultdict(int)
|
||||
strip = string.whitespace + string.punctuation + string.digits + "\"'"
|
||||
for filename in sys.argv[1:]:
|
||||
with open(filename) as file:
|
||||
for line in file:
|
||||
for word in line.lower().split():
|
||||
word = word.strip(strip)
|
||||
if len(word) > 2:
|
||||
words[word] = +1
|
||||
for word in sorted(words):
|
||||
print("'{0}' occurs {1} times.".format(word, words[word]))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
count_unique_word_file()
|
Loading…
x
Reference in New Issue
Block a user