**squareUp:**

public int[] squareUp(int n) { int[] result = new int[n * n]; int pos = 0; for (int i = 1; i <= n; i++) { for (int k = 1; k <= n - i; k++) result[pos++] = 0; for (int j = i; j > 0; j--) result[pos++] = j; } return result; }

**seriesUp:**

public int[] seriesUp(int n) { int[] result = new int[n * (n + 1) / 2]; int pos = 0; int i = 1; while (i <= n + 1) { for (int j = 1; j < i; j++) result[pos++] = j; i++; } return result; }

**maxMirror:**

public int maxMirror(int[] nums) { int[] numsCopy = new int[nums.length]; for (int i = nums.length - 1, j = 0; i >= 0; i--, j++) numsCopy[j] = nums[i]; int max = 0; for (int i = 0; i < nums.length; i++) { int count = 0; int pos1 = i; int pos2 = 0; boolean flag = false; while (pos1 < nums.length && pos2 < nums.length) { if (!flag) { if (nums[pos1] != numsCopy[pos2]) pos2++; else { flag = true; count = 1; pos1++; pos2++; } } else { if (nums[pos1] == numsCopy[pos2]) { count++; pos1++; pos2++; } else { if (count > max) max = count; pos1 = i; flag = false; } } if (count > max) max = count; } } return max; }

The input array is reversed to make the subsequent steps clearer to follow. This leads to slightly more code, but it should increase comprehensibility.

**countClumps:**

public int countClumps(int[] nums) { int count = 0; for (int i = 0; i < nums.length - 1; i++) if (nums[i] == nums[i + 1]) { count++; for (int j = i + 1; j < nums.length; j++) if (nums[j] == nums[i]) i++; else break; } return count; }

At first I was tempted to use only one for loop and operate with a flag variable. Using a second for loop led to a more elegant solution, though. A neat detail is that the running time is linear since the nested for loop only increases i.

Joseph GabriellaI can not follow the logic of your code below for the SeriesUp Array 3 problem.

You begin by declaring i=1. Then, you for statement after declaring j=1, you write j<i as the condition. That means, that initially both j and i = 1, so the condition is not met and the for loop should not execute, right?

Can you explain what I am missing here?

int i = 1;

while (i <= n + 1) {

for (int j = 1; j < i; j++) result[pos++] = j;

i++;

}

Gregor UlmPost authorIt seems you’re disregarding the outer while-loop. Your reasoning is correct when n == 0. In that case the outer while-loop gets executed once, and since j == i, the body of the for-loop won’t be executed.

However, consider what happens when n > 0. Let’s say n == 1. The condition of the while-loop then becomes “i < = 2". In the first iteration, i == 1 and j == 1, and thus the for-loop won't get executed. However, afterwards the variable i gets incremented by 1. In the second iteration of the while-loop, j again starts at 1, but i == 2, which means that the loop will execute, since in this case i is less than j. The reasoning for n > 1 is similar.

Does this help?

Gregor UlmPost authorBy the way, Joseph, are you sure you don’t want to explore Haskell instead of Java? The solution is a one-liner in that language:

seriesUp :: Int -> [Int]

seriesUp n = concatMap (\x -> [1..x]) [1..n]

KennyHello,Gregor, I try your solution at SeriesUp, because I was freaking out by that problem. But why the Codingbat returned the timed out errors?

Stefanpublic int[] seriesUp(int n) {

int array[] = new int[n*(n+1)/2];

int index = 1;

int counter = 2;

for(int i = 0;i<array.length;i++){

array[i]= index++;

if(index ==counter){

counter++;

index = 1;

}

}

return array;

}

Stefanpublic int[] squareUp(int n) {

int index = 1;

int counter = 0;

int array[] = new int[n*n];

for(int i = array.length-1;i>=0;i–){

if(index<=n-counter)

array[i]=index++;

if(i%n==0){

counter++;

index = 1;

}

}

return array;

}

EksoHello! I was wondering if you could display a more efficient solution to maxMirror (without reversing input). I read your note and wondered out of curiosity what you would have done if comprehensibility wasn’t an issue.

Gregor UlmPost authorWhy would I want to obfuscate my code for the sake of an imagined performance increase? In terms of performance, the difference between filling an array from the front vs from the back is either negligible or zero (look up ‘branch prediction’), and would depend on implementation details of the JVM. I would guess that there is no noticeable difference in performance. At least I have no problems coming up with effectively identical JVM byte code for both cases. If you really were concerned with performance optimisation at this level, you should ask yourself why you would want to write your program in Java in the first place, though.

Anony Manoof, talk about poor human resources/customer service…

Gregor UlmPost authorThis is a private blog. You don’t become a “customer” by reading it.

Raunak Pillaiint [] arr = new int[n*n];

int i = 1;

while(i 0){

if(temp <= i){

arr[index++] = temp;

}

else{

arr[index++] = 0;

}

temp–;

}

i++;

}

Raunak Pillai*while( i <= n)

AlexmaxMirror is massive… maybe try this:

public int maxMirror(int[] nums) {

int max = 0;

for(int i = 0; i = 0 && start < nums.length){

if(nums[start] == nums[end]){

count++;

max = Math.max(max, count);

start++;

}else{

count = 0;

start = i;

}

end–;

}

}

return max;

}

AlexFormatter is messing up the code…?

public int maxMirror(int[] nums) {

int max = 0;

for(int i = 0; i = 0 && start < nums.length){

if(nums[start] == nums[end]){

count++;

max = Math.max(max, count);

start++;

}else{

count = 0;

start = i;

}

end–;

}

}

return max;

}

AlexNo idea what’s going on with your website but ¯\_(ツ)_/¯

Gregor UlmPost authorYou need to put source code in tags.

ArchyBaldpublic int maxMirror(int[] nums) {

int max = 0;

int numsLength = nums.length;

for (int start = 0; start < numsLength; start++) {

if (start + max > numsLength - 1) {

break;

}

int count = 0;

for (int end = numsLength - 1; end >= 0; end--) {

if (count + start < numsLength) {

if (nums[start + count] == nums[end]) {

count++;

max = Math.max(max, count);

} else if (count > 0) {

count = 0;

end++;

}

}

}

}

return max;

}

ArchyBaldpublic int maxMirror(int[] nums) {

int max = 0;

int numsLength = nums.length;

for (int start = 0; start numsLength - 1) {

break;

}

int count = 0;

for (int end = numsLength - 1; end >= 0; end--) {

if (count + start 0) {

count = 0;

end++;

}

}

}

}

return max;

}

ArchyBaldOk. I give up.

Mike SchärerHow difficult would you rate the maxMirror problem on a scale from 1 to 10 with 10 being the most difficult problems? I’m asking because it took me a very long time to solve it on my own..I’m beginning to doubt my coding ability.

Gregor UlmPost authorI don’t consider it particularly difficult. If I put the most difficult problems I encountered in CS at university at 10, then even the more difficult Coding Bat exercises are at most a 3, and even that would be rather generous, to be honest. Keep in mind that CodingBat exercises get progressively more difficult, so don’t skip any exercises. Also, if you don’t fully grasp an exercise, spend some more time on it.

Mike SchärerCould you give an example of a problem in the range 7-10 from your university?

Gregor UlmPost authorLook up Master’s thesis proposals in programming language theory or algorithms.