Algorithm Practice

Sorted indexes

Given an array, sort the elements from the largest to the smallest. Create a result array using the indices of the original array.

  • Example: arr = [4,4,4,10,6,6,5]
  • res = [3,4,5,6,0,1,2]

Missing results from graphql query

Given a graphql-like query string and an object, return an array of paths that exist in the graphql-like string and don't exist in the object.

  • Example given:
const graphqlQuery = `
{
    age
    name {
        first
        last
    }
    parent {
        name {
            first
            last
        }
        age
    }
    contact {
        phone
        email
    }
}`

and

const person = {
    name: {
        first: 'joe'
    },
    contact: {
        email: 'joe@joe.joe',
        phone: 7788713377
    }
}

Should return

[
    'age',
    'name.last',
    'parent.name.first',
    'parent.name.last',
    'parent.age',
]

Find path through data

// function(string): string
function shuffle(array) {
    array.sort(() => Math.random() - 0.5);
}

const testData = [
    { "source": "Home", "destination": "Home Cleaning" },
    { "source": "Home Cleaning", "destination": "Restaurants" },
    { "source": "Restaurants", "destination": "Delivery" },
    { "source": "Delivery", "destination": "Address Search" },
    { "source": "Address Search", "destination": "Burgers" },
    { "source": "Burgers", "destination": "Order Delivery" },
    { "source": "Order Delivery", "destination": "Start Order" },
    { "source": "Start Order", "destination": "Turkey Burger" },
];

shuffle(testData);

// Given the shuffled click data and an origin page, find the final destination page
// ex: input: 'Home' -> output: 'Turkey Burger'
function getDestinationFromOrigin(origin) {
    
    const initialSourceObject = testData.filter(el => el.source === origin)[0]
    
    const history = []
    let currentSource = initialSourceObject.source
    let currentDestination = initialSourceObject.destination
    history.push(currentDestination)
 
    // stay in while loop while currentDestination does not exist as a source in the inputArray
    while (testData.map(el => el.source).indexOf(currentDestination) !== -1) {

        // find element where source = currentDestination
        currentSource = currentDestination
        // find element of array where source = currentSource, then get the destination of that object and set it to currentDestination
        currentDestination = testData.find(el => el.source === currentSource).destination

        if (history.includes(currentSource)) {
            console.log('hey, you\'re in a loop!')
            return
        }
        history.push(currentDestination)
    }
    return currentDestination
}
// what if we get an input origin that doesn't exist?
// what if we get a circular path?
// what if a single source has multiple destinations? (ie. multiple objects with same source but different destination)

Getting best sequence of increasing values

Given an array of integers, get the highest number of sequences where values are increasing in whatever way is optimal for the array to be arranged.

  • ex. given [1, 1, 2, 2], the result should be 2, since we can rearrange the array to be [1, 2, 1, 2], which features 2 instances of the value increasing
  • ex. given [1, 3, 2, 4, 3, 5], the result should be 4, since we can rearrange the array to be [1, 2, 3, 3, 4, 5]