# Make an array with this series (java challenge)

• Comp Sci

## Homework Statement

Given n>=0, create an array length n*n with the following pattern, shown here for n=3 : {0, 0, 1, 0, 2, 1, 3, 2, 1} (spaces added to show the 3 groups).

## The Attempt at a Solution

Java:
public int[] squareUp(int n) {
int length = n*n;
int[] completeArry = new int[length];

for(int subArray=1;subArray<n;subArray++) {
int beginPoint = length- (n*(n-subArray)+1);
int end = beginPoint+n-1;
int elements = 1;
for(int j=beginPoint;j>=end;j--) {

if(elements<=subArray) {
completeArry[j] = elements;
elements++;
}

}

}
return completeArry;
}

Why is my array just full of zeroes? it doesn't even do anything. All it does it create an array full of zeroes with length n*n.

The idea is that there will be N sub arrays, so i initialize subArray to start at the first sub array.\

The beginning point of the array is where my second nested loop will start and then the endpoint is obviously where it ends. Elements represents the integer that it should add up to(which it will never go beyond the subarray value. So why isn't this algorithm doing anything?

Last edited:

Turns out the line

Code:
end=beginPoint+n-1

should be - n, not + n.

Code:
for(int j=beginPoint;j>=end;j--)

If end>beginpoint, this loop will be executed 0 times.

Mark44
Mentor

## Homework Statement

Given n>=0, create an array length n*n with the following pattern, shown here for n=3 : {0, 0, 1, 0, 2, 1, 3, 2, 1} (spaces added to show the 3 groups).
It's not at all obvious to me how this pattern would look like for different values of n. Presumably that's not what your question was about.
Arnoldjavs3 said:

## The Attempt at a Solution

Java:
public int[] squareUp(int n) {
int length = n*n;
int[] completeArry = new int[length];

for(int subArray=1;subArray<n;subArray++) {
int beginPoint = length- (n*(n-subArray)+1);
int end = beginPoint+n-1;
int elements = 1;
for(int j=beginPoint;j>=end;j--) {

if(elements<=subArray) {
completeArry[j] = elements;
elements++;
}
}
}
return completeArry;
}
It's very misleading to have a loop control variable named subArray. That name implies that it would be an array of some kind, not a loop control variable. For this purpose, i would do just fine.

Are you supposed to fill a two dimensional array? If that's the case, then thinking about subarrays makes sense. Here each subarray would be a row of the larger n x n matrix.
It would be helpful if you posted the complete problem description.
Arnoldjavs3 said:
Why is my array just full of zeroes? it doesn't even do anything. All it does it create an array full of zeroes with length n*n.

The idea is that there will be N sub arrays, so i initialize subArray to start at the first sub array.\

The beginning point of the array is where my second nested loop will start and then the endpoint is obviously where it ends. Elements represents the integer that it should add up to(which it will never go beyond the subarray value. So why isn't this algorithm doing anything?

Code:
for(int j=beginPoint;j>=end;j--)

If end>beginpoint, this loop will be executed 0 times.

It's not at all obvious to me how this pattern would look like for different values of n. Presumably that's not what your question was about.
It's very misleading to have a loop control variable named subArray. That name implies that it would be an array of some kind.

Are you supposed to fill a two dimensional array? If that's the case, then thinking about subarrays makes sense. Here each subarray would be a row of the larger n x n matrix.
It would be helpful if you posted the complete problem description.

That actually is the full problem description. Here's the link for more examples:
http://codingbat.com/prob/p155405

I fixed the issue though. Like the quote above had stated, endpoint was greater than beginpoint so I had to fix that. The idea of 'subarray' was more or less just parts of the array divided equally for every N elements. Kinda like substring.

new code:
Java:
public int[] squareUp(int n) {
int length = n*n;
int[] completeArry = new int[length];

for(int subArray=1;subArray<=n;subArray++) {
int beginPoint = length- (n*(n-subArray)+1);
int end = beginPoint-n+1;
int elements = 1;
for(int j=beginPoint;j>=end;j--) {

if(elements<=subArray) {
completeArry[j] = elements;
elements++;
}

}

}
return completeArry;
}

I imagine from your perspective it's alot harder to pick up on how my algorithm works here... But the idea is that it works from right to left starting at the end of the 'subarray' in the initial for loop.

Mark44
Mentor
I imagine from your perspective it's alot harder to pick up on how my algorithm works here... But the idea is that it works from right to left starting at the end of the 'subarray' in the initial for loop.
Which is exactly why we use comments. One that would be useful here is to explain that you algorithm fills the array from the end to the beginning. Another would be an explanation that the inner loop starts off where a previous iteration ended.