Algorithm for checking clumps inside an array not working

  • Thread starter Thread starter Arnoldjavs3
  • Start date Start date
  • Tags Tags
    Algorithm Array
Click For Summary

Discussion Overview

The discussion revolves around a programming problem related to counting "clumps" in an array, defined as adjacent elements of the same value. Participants explore different approaches to implement a solution, including the logic behind their code and potential improvements.

Discussion Character

  • Homework-related
  • Technical explanation
  • Debate/contested

Main Points Raised

  • The original code attempts to count clumps using nested loops, but the author expresses confusion about its functionality and identifies a potential issue with the variable iterationsLeft.
  • One participant questions the necessity of the iterationsLeft variable, prompting the author to realize its ineffectiveness in preventing out-of-bounds errors.
  • The author shares a revised version of the code that appears to work, but questions whether using two nested loops complicates the solution unnecessarily.
  • Another participant suggests a simplified approach that checks adjacent elements directly after starting the outer loop, proposing a different structure for the loops to avoid out-of-bounds errors.

Areas of Agreement / Disagreement

Participants do not reach a consensus on the best approach to solve the problem, as multiple methods are proposed and discussed, with varying levels of complexity and effectiveness.

Contextual Notes

The discussion highlights the challenges of managing loop indices and preventing out-of-bounds errors in array manipulation, as well as the subjective nature of code simplicity.

Arnoldjavs3
Messages
191
Reaction score
3

Homework Statement


Say that a "clump" in an array is a series of 2 or more adjacent elements of the same value. Return the number of clumps in the given array.

countClumps([1, 2, 2, 3, 4, 4]) → 2
countClumps([1, 1, 2, 1, 1]) → 2
countClumps([1, 1, 1, 1, 1]) → 1

Homework Equations


The logic is that it'll set a number to currentNum in the first for loop, and then run another for loop(with how many iterations that it must run so it doesn't go out of bounds) to check if there are clumps. If the number nums[x] = nums, then it'll notice that it's found a clump. This will increment the ctr by 1 and set the boolean to true. Then the loop will find the index of which the clump ends and set i = x, that index. Hopefully this makes sense verbally and more so in my code

The Attempt at a Solution


Java:
public int countClumps(int[] nums) {
  int length = nums.length;
  boolean clumpFound = false;
  int clumpCtr = 0;
  int currentNum = 0;
  int iterationsLeft = 0;
 
  for(int i = 0;i<length;i++) {
    currentNum = nums[i];
    iterationsLeft = length-i;
 
      for(int x = i+1; x<iterationsLeft;x++) {
        if (nums[x]==currentNum && clumpFound == false) {
          clumpCtr++;
          clumpFound = true;
        }
        else if(nums[x]!=currentNum &&  clumpFound == true) {
          clumpFound = false;
          i=x;
          break;
        }
        else if(nums[x]!=currentNum && clumpFound == false) {
          break;
        }
     
      }
 
  }
  return clumpCtr;
}

I'm having a really hard time visualizing this in my head as to what's going wrong here.
Here are the tests it fails/passes:
http://prntscr.com/dz1x1f
 
Physics news on Phys.org
Tell me, what's your iterationsLeft variable for?
 
It was meant to prevent it from going out of bounds by only having it go through the second for loop as many times as it could(but clearly it does not achieve this, now I notice)

Here is the new code that works!:
Java:
public int countClumps(int[] nums) {
  int length = nums.length;
  boolean clumpFound = false;
  int clumpCtr = 0;
  int currentNum = 0;
  int iterationsLeft = 0;

  for(int i = 0;i<length;i++) {
    currentNum = nums[i];
   

      for(int x = i+1; x<length;x++) {
        if (nums[x]==currentNum && clumpFound == false) {
          clumpCtr++;
          clumpFound = true;
        }
        else if(nums[x]!=currentNum &&  clumpFound == true) {
          clumpFound = false;
          i=x-1;
          break;
        }
        else if(nums[x]!=currentNum && clumpFound == false) {
          break;
        }
 
      }

  }
  return clumpCtr;
}

That one question was enough to make me realize... lol
Edit: Do you think me having to create two for loops makes this solution too complicated? I'm relatively new to computer science, I'd say I'm blazing through challenges but my solutions are definitely not simple. I think simple solutions that achieve the same end are better?
 
  • Like
Likes   Reactions: Drakkith
One thing to note: If you check to see if nums[ i ] == nums[i+1] right after you start your outer for loop, I think you can greatly simplify things. I haven't checked to see if this works, but you can try it if you'd like:
Java:
for (int i = 0; i < length-1; i++)
     if (nums[i] == nums[i+1]){
          clumpCtr++;
          for (int x = i+1; nums[x] == nums[x+1] && x < length-1; x++){
               i = x+1;
     }
}

I put a length - 1 in the for loops to make sure you can never try to check beyond the array.
 
  • Like
Likes   Reactions: Arnoldjavs3

Similar threads

  • · Replies 80 ·
3
Replies
80
Views
10K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 34 ·
2
Replies
34
Views
6K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 5 ·
Replies
5
Views
2K
Replies
5
Views
2K
  • · Replies 1 ·
Replies
1
Views
1K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 3 ·
Replies
3
Views
3K