amr mahdy
amr mahdy

Reputation: 46

Electronic shop hackerRank challenge in Javascript

Hi I did not pass the all the tests, only 9/16. so I want to know what is the problem in my code problem link:https://www.hackerrank.com/challenges/electronics-shop/problem

function getMoneySpent(keyboards, drives, b) {
    let arr = [];
   let lenOfArr1 = keyboards.length;
    let lenOfArr2 = drives.length;
    let j = drives.length;
    arr = keyboards.slice(0);
    for (let number of drives) {
        arr.push(number);
    }
    return (challenge(arr, lenOfArr1, b));
}


function challenge(arr, lenOfArr1, m) {
    let result = [];
   let j = lenOfArr1;
    for (let i = 0; i < lenOfArr1; i++) {
        if (arr[i] >= m || arr[j] >= m) return -1;
        if (arr[i] + arr[j] < m) {
            result.push(arr[i] + arr[j]);
        }
        i--;
        j++;
        if (j == arr.length) {
            i++;
            j = lenOfArr1;
        }
    }
    if (result.length == 0) return -1;
    return result.sort()[result.length - 1];
}

Upvotes: 0

Views: 1497

Answers (2)

trincot
trincot

Reputation: 350756

The following line causes your code to return -1 when there might be a solution:

if (arr[i] >= m || arr[j] >= m) return -1;

Even though one price may be above budget, you need to consider that there might be cheaper items available. You might even already have solutions in result, or they might still be found in a later iteration.

It is not clear to me why you first create a merged array of both input arrays. It does not seem to bring any benefit.

If you sort the input arrays, you can use a two-pointer system where you decide which one to move depending on whether the current sum is within limits or it is too great:

function getMoneySpent(keyboards, drives, b) {
    keyboards = [...keyboards].sort((a, b) => b - a) // descending
    drives = [...drives].sort((a, b) => a - b); // ascending
    let k = keyboards.length - 1; // cheapest
    let d = drives.length - 1; // most expensive
    let maxSum = -1;
    while (d >= 0 && k >= 0) {
        let sum = keyboards[k] + drives[d];
        if (sum === b) return b;
        if (sum < b) {
            if (sum > maxSum) maxSum = sum;
            k--; // will increase sum 
        } else {
            d--; // will decrease sum
        }
    }
    return maxSum;
}

Upvotes: 0

zenwraight
zenwraight

Reputation: 2000

From the given constraints in the problem statement, you don't need such a complex solution.

Here is the Algorithm:

  1. Initialize a variable maxValue to have value as -1.
  2. Start two for loops over drives and keyboards and take all combinations and sum the value of each drive with each keyboard.
  3. Inside the for loops, check if the sum of drive + keyboard and it should be less than or equal to the money Monica has and keep track of the maximum value you get from any combination in maxValue.
  4. After the code computation, return maxValue.

Code:-

function getMoneySpent(keyboards, drives, b) {
    let maxValue = -1;
    for (let drive of drives) {
        for(let keyboard of keyboards) {
            let cost = drive + keyboard;
            if(cost > maxValue && cost <= b) {
                maxValue = cost;
            }
        }
    }
    return maxValue;
}

Overall Time complexity - O(n^2).

Hope this helps!

Upvotes: 1

Related Questions