0

The task is:

Given an array of digitals numbers, return a new array of length number containing the last even numbers from the original array (in the same order).

Codewars compiler shows the "Execution Timed Out (12000 ms)" error, though the code is working as intended. Please help to optimize my code, because I can't figure it out myself

My code:

function evenNumbers(array, number) {
  for (let i=0; i < array.length; i++) {
    if (array[i] % 2 != 0) {
      array.splice(i, 1); 
      i -= 1;
    }
  }
  array.splice(0, array.length - number)
  return array;
}

1 Answer 1

1

You're iterating over the whole array, but you only need to iterate over number elements. For example, given a number of 5, you only need to iterate until you find 5 values fulfilling the condition - you don't want to iterate over all of a 10,000-length array if you don't have to. (Codewars tests often have such huge object structures.)

It also says to return a new array, not modify the existing array.

const evenNumbers = (array, number) => {
  const newArr = [];
  for (let i = array.length - 1; i >= 0 && newArr.length <= number; i--) {
    if (array[i] % 2 === 0) newArr.unshift(array[i]);
  }
  return newArr;
};

console.log(evenNumbers(
  [1, 2, 3, 4, 5, 6, 7, 8],
  3
));

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you! I will keep in mind to read problems more carefully and try to minimize iterations in loops. I've redone my code to resemble yours, though noticed that the second condition in the loop must be " newArr.length < number ", rather than " <= ", because otherwise it adds one more element to newArr than necessary.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.