Quick actions

cmd+k|ctrl+k

Navigation

Languages

Master the Coding Interview

Snippet info

Language

Python

Visibility

public

Author

rakeshbhatia87

Created

2023-01-02T21:01:08.886442Z

Updated

2023-01-02T21:01:08.886442Z

# Given two arrays, create a function that 
# lets a user know (true/false) whether 
# these two arrays contain any common items.
import time

# Brute force solution
def doArraysHaveCommonItems1(x, y):
    for i in range(len(x)):
        for j in range(len(y)):
            if x[i] == y[j]:
                print("True")
                return True
    return False

# Optimized solution
def doArraysHaveCommonItems2(x, y):
    # Create a set from first array
    x_set = set(x)
    # Only loop through one array
    for item in y:
        if item in x_set:
            print("True")
            return True
    return False
    
a = [1, 2, 4, 7]
b = [3, 5, 7, 8]

start = time.time()
doArraysHaveCommonItems1(a, b)
end = time.time()
t1 = end - start
print(str(t1) + " secs")

start = time.time()
doArraysHaveCommonItems2(a, b)
end = time.time()
t2 = end - start
print(str(t2) + " secs")

# Create a function that reverses a string.
def reverseString(s):
    l = 0
    r = len(s) - 1
    s = list(s)
    while l < r:
        s[l], s[r] = s[r], s[l]
        l += 1
        r -= 1
    return ''.join(s)

# Merge two sorted arrays
def mergeSortedArrays(a, b):
    res = []
    i = j = 0
    while i < len(a) and j < len(b):
        if a[i] < b[j]:
            res.append(a[i])
            i += 1
        elif b[j] < a[i]:
            res.append(b[j])
            j += 1
        else:
            res.append(a[i])
            res.append(b[j])
            i += 1
            j += 1
    return res

class HashTable:
    def __init__(self, size):
        self.size = size
        self.data = [[]] * (size)
    
    def _hash(self, key):
        hash_value = 0
        for i in range(len(key)):
            hash_value = (hash_value + ord(key[i]) * i) % len(self.data)
        return hash_value
            
    def set(self, key, value):
        address = self._hash(key)
        if not self.data[address]:
            self.data[address] = []
        self.data[address].append([key, value])
        return self.data
        
    def get(self, key):
        address = self._hash(key)
        currentBucket = self.data[address]
        print(currentBucket)
        if currentBucket:
            for i in range(len(currentBucket)):
                if currentBucket[i][0] == key:
                    return currentBucket[i][1]
        return None
    
    def keys(self):
        keysArray = []
        for i in range(len(self.data)):
            if self.data[i]:
                keysArray.append(self.data[i][0][0])
        return keysArray

# First recurring character
def firstRecurringCharacter(vals):
    items = {}
    for i in range(len(vals)):
        if not items[vals[i]]:
            items[i] = vals[i]
        else:
            return vals[i]
    return None

# Implement a linked list
class Node:
    def __init__(self, value):
        self.value = value
        self.next = None
        
class LinkedList:
    def __init__(self, value):
        self.head = Node(value)
        self.tail = self.head
        self.length = 1
    
    def append(self, value):
        node = Node(value)
        self.tail.next = self.node
        self.tail = node
        self.length += 1
        return self.head
    
    def prepend(self, value):
        node = Node(value)
        node.next = self.head
        self.head = node
        self.length += 1
        return self.head
    
    def printList(self):
        array = []
        currentNode = self.head
        while currentNode:
            array.append(currentNode.value)
            currentNode = currentNode.next
        return array
    
    def insert(index, value):
        if index == 0:
            return self.prepend(value)
        elif index >= self.length:
            return self.append(value)
        node = Node(value)
        currentNode = self.head.next
        prevNode = self.head
        count = 1
        while currentNode:
            if index == count:
                prevNode.next = node
                node.next = currentNode
                self.length += 1
                break
            prevNode = currentNode
            currentNode = currentNode.next
            count += 1
        return self.printList()
    
    def remove(index):
        if index == 0:
            self.head = self.head.next
            self.head.prev = None
            self.length -= 1
            return self.printList()
        currentNode = self.head.next
        prevNode = self.head
        count = 1
        while currentNode:
            if index == count:
                prevNode.next = currentNode.next
                self.length -= 1
                break
            prevNode = currentNode
            currentNode = currentNode.next
            count += 1
        return self.printList()
    
    def reverse(self):
        currentNode = self.head
        prevNode = None
        self.tail = self.head
        while currentNode:
            temp = currentNode
            currentNode = currentNode.next
            temp.next = prevNode
            prevNode = temp
        self.head = temp
        return self.printList()

class Node:
    def __init__(self, value):
        self.value = value
        self.prev = None
        self.next = None

class DoublyLinkedList:
    def __init__(self, value):
        self.head = Node(value)
        self.tail = self.head
        self.length = 1
    
    def append(self, value):
        node = Node(value)
        self.tail.next = node
        node.prev = self.tail
        self.tail = node
        self.length += 1
        return self.head
    
    def prepend(self, value):
        node = Node(value)
        node.next = self.head
        node.prev = None
        self.head = node
        self.length += 1
        return self.head
    
    def printList(self):
        array = []
        currentNode = self.head
        while currentNode:
            array.append(currentNode.value)
            currentNode = currentNode.next
        return array
    
    def insert(index, value):
        if index == 0:
            return self.prepend(value)
        elif index >= self.length:
            return self.append(value)
        node = Node(value)
        currentNode = self.head.next
        prevNode = self.head
        count = 1
        while currentNode:
            if index == count:
                prevNode.next = node
                node.prev = prevNode
                node.next = currentNode
                currentNode.prev = node
                self.length += 1
                break
            prevNode = currentNode
            currentNode = currentNode.next
            count += 1
        return self.printList()
    
    def remove(index):
        if index == 0:
            self.head = self.head.next
            self.length -= 1
            return self.printList()
        currentNode = self.head.next
        prevNode = self.head
        count = 1
        while currentNode:
            if index == count:
                prevNode.next = currentNode.next
                currentNode.next.prev = prevNode
                self.length -= 1
                return self.printList()
            prevNode = currentNode
            currentNode = currentNode.next
            count += 1
        return self.printList()




INFO