AMK
AMK

Reputation: 41

can anyone tell me what is this code for?

can anyone tell me what is this code for? especially this line of code, I can't understand this line ctr[arr[i] - 1]++;

function array_element_mode(arr) {
  var ctr = [],
    ans = 0;

  for (var i = 0; i < 10; i++) {
    ctr.push(0);
  }
  for (var i = 0; i < arr.length; i++) {
    // what is this code for??
    ctr[arr[i] - 1]++;
    if (ctr[arr[i] - 1] > ctr[ans]) {
      ans = arr[i] - 1;
    }
  }
  return ans + 1;
}
console.log(array_element_mode([1, 2, 3, 2, 2, 8, 1, 9]))

Upvotes: 0

Views: 127

Answers (3)

Pan Vi
Pan Vi

Reputation: 667

I renamed the varibles and splitted ctr[arr[i] - 1]++; into two lines. This functions is supposed to find the number which appears most in a given array of integers.

But it wont work if two or more integers appear the same number of times and if the array contains 0.

/* 
 *  Goal: Find the number which appears most in a given array of integers
 *  Solution: In the ctr array store the number apperences in the following way 
 *  ctr[0] appearances of "1" in the array
 *  ctr[1] appearances of "2" in the array
 *  ctr[2] appearances of "3" in the array
 *  ...
 */

function array_element_mode(arr) {
  var ctr = [],
    ans = 0;

  // fill the ctr array with nulls  
  for (var i = 0; i < 10; i++) {
    ctr.push(0);
  }


  for (var i = 0; i < arr.length; i++) {

    //////////// here the ctr[arr[i] - 1]++; is splitted into 2 lines

    // for each array member "find" the correct index to increase
    const convertArrayMemberToIndexForCtr = arr[i] - 1;
    // increase the correct index by one 
    ctr[convertArrayMemberToIndexForCtr]++;

    ///////////


    // check if the increased index if larger then current answer and if so
    // store it as the new result
    if (ctr[convertArrayMemberToIndexForCtr] > ctr[ans]) {
      ans = convertArrayMemberToIndexForCtr;
    }
  }

  // return the result, but not the index we created before (on line 25), but the real   number that is in the array (add the +1 we subtracted before)
  return ans + 1;
}

console.log('working example');
console.log(array_element_mode([1, 2, 3, 2, 2, 8, 1, 9]));

console.log('this wont work, it shows that "3" is the result, ignoring the "2"');
console.log(array_element_mode([3, 3, 3, 2, 2, 2, 5, 9]));

console.log('this wont work as index arr[i] - 1 would then be 0-1=-1');
console.log(array_element_mode([0, 1, 1, 0, 0, 4, 5, 9]));

console.log('this wont work, all integers are only once in the array');
console.log(array_element_mode([1, 2, 3, 4, 5, 6, 7, 8]));

Upvotes: 1

Dov Rine
Dov Rine

Reputation: 840

I believe that this function is supposed to return the mathematical mode of an array.

I just added/fixed some variable names to your function. This is still a terrible implementation but I'm hoping that the edits will make what it does more clear to you.

function array_element_mode2(arr) {
    var center = [],
      mode = 0;
  
    for (let i = 0; i < 10; i++) {
      center.push(0);
    }
    for (let i = 0; i < arr.length; i++) {
        const priorElementOfArr = arr[i] - 1; 
        center[priorElementOfArr]++;
      if (center[priorElementOfArr] > center[mode]) {
        mode = priorElementOfArr;
      }
    }
    return mode + 1;
  }

Upvotes: 2

white to code
white to code

Reputation: 11

I think this function is to find out which element has the most number in the array

ctr[arr[i] - 1]++:In order to count

Upvotes: 0

Related Questions