0

I'm trying to solve the problem below but I'm stuck in knowing how to compare one index with another that's not consequently for example:

const arr = ["Juan", "Maria", "Maria", "Juan"]

In this case, comparing index 1 and 2 would be simple, but how can I pick index 0 and then compare it with each one of the others until it get to index 3 to be matched?.

Exercise Input: USA, AUSTRALIA, AUSTRALIA, INDIA, FRANCE, USA

Print out the name of the Country and word "Bingo" if the element (Country name) is repeated and located one after another

Print out the name of the Country and word "Hooray" if the element (Country name) is repeated and located not consequently

Note: Use any Array method

Expected result: "Bingo Australia" "Hooray USA"

This is what I've tried.

Note that if I run it that way it would work but only because I'm accessing countries[index + 5].

How can I make the index to dynamically increases itself when the iteration finishes?

const countries = ['USA', 'Australia', 'Australia', 'France', 'India', 'USA'];

countries.forEach((value, index) => {
    if (countries[index] === countries[index + 1]) {
        console.log(`Bingo ${value}`);
    } else if (countries[index] === countries[index + 5]) {
        console.log(`Hooray ${value}`);
    }
});

2 Answers 2

0

You can try something like this, it is not most efficient but it will solve your problem:

const countries = ['USA', 'Australia', 'Australia', 'France', 'India', 'USA'];

countries.forEach((value, index, arr) => {
  arr.forEach((val, idx) => {
    if (val === value && index < idx) {
      if (idx === index + 1) console.log(`Bingo ${value}`);
      else console.log(`Hooray ${value}`);
    }
  });
});
Sign up to request clarification or add additional context in comments.

2 Comments

Thank you very much, I understood how you solve it. Do you think is there a possible way of doing it without two forEach?
I don't think that you can solve it in O(n). You can use some different array methods inside forEach, for example indexOf, but it still have O(n) complexity and it will result in O(n^2). You can make it more efficient with nested for loops with break, so you avoid looping throw whole array once you make a hit.
0

Solution with a lot of 'if' (just reduce iterations (loop count) Wrote with purpose with for loop, in reality, it is same as a nested loop.

const c_arr = [1, 4, 5, 5, 6, 7, 4, 1];
let j = 0;
let full_count = 0; //count loops

for (let i = 0; i < c_arr.length; ++i) {
  if (j === 0 & c_arr[i] === c_arr[i + 1]) { // condition j ==0 so it will go inside only in first loop
    console.log('Bingo', c_arr[i])
  }

  // console.log("Test", c_arr[j]);
  if (i + 2 < c_arr.length & c_arr[j] === c_arr[i + 2]) { // i+2 cond, to avoid to access elem. outside array
    console.log('Hooray', c_arr[i + 2]);
    c_arr[j] = null;
  }

  // All to reduce loop count
  if (j > 0 & c_arr[j] === null) { // allneigbourgh elements are checked
    i = j;
    ++j;
  }
  if (j > 0 & i === c_arr.length - 3) { // avoid empty loop, condition for Hooray is i+2
    i = j;
    ++j;
  }
  if (i === c_arr.length - 1) { // on first loop increase j
    i = j;
    ++j;
  }
  // to stop loop when J reaches arr :-2 element
  if (j === c_arr.length - 2) {
    i = c_arr.length;
  }
  ++full_count;
}

console.log(full_count, " :loops count");

Comments

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.