How to Solve the “To Square(root) or Not to Square(root)” Challenge in Java

  • Home /
  • Blog Posts /
  • How to Solve the “To square(root) or not to square(root)” Challenge in Java

The challenge

Write a method, that will get an integer array as parameter and will process every number from this array.
Return a new array with processing every number of the input-array like this:

If the number has an integer square root, take this, otherwise square the number.

[4,3,9,7,2,1] -> [2,9,3,49,4,1]

The input array will always contain only positive numbers and will never be empty or null.

Test cases

import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.junit.runners.JUnit4;
import java.util.Arrays;

public class SolutionTest {
    @Test
    public void basicTests() {
        int[] input = new int[] { 4, 3, 9, 7, 2, 1 };
        int[] expected = new int[] { 2, 9, 3, 49, 4, 1 };
        assertEquals(Arrays.toString(expected), Arrays.toString(Squarer.squareOrSquareRoot(input)));

        input = new int[] { 100, 101, 5, 5, 1, 1 };
        expected = new int[] { 10, 10201, 25, 25, 1, 1 };
        assertEquals(Arrays.toString(expected), Arrays.toString(Squarer.squareOrSquareRoot(input)));

        input = new int[] { 1, 2, 3, 4, 5, 6 };
        expected = new int[] { 1, 4, 9, 2, 25, 36 };
        assertEquals(Arrays.toString(expected), Arrays.toString(Squarer.squareOrSquareRoot(input)));        
    }
}

The solution in Java

Option 1 (using a loop):

public class Squarer {
  public static int[] squareOrSquareRoot(int[] array) {
    
    for (int i=0; i<array.length; i++) {
        
        double sqr = Math.sqrt(array[i]);
        if (sqr==Math.round(sqr)) {
            // can square
            array[i] = (int)sqr;
        } else {
            // perform square
          array[i] = array[i]*array[i];
        }
        
    }
    
    return array;
  }
}

Option 2 (using a stream):

import java.util.Arrays;

public class Squarer {
  public static int[] squareOrSquareRoot(int[] array) {
    return Arrays.stream(array)
          .map(i -> Math.sqrt(i) % 1 == 0 ? ((int) Math.sqrt(i)) : (i * i))          
          .toArray();      
  }
}

Option 3 (using an IntStream):

import static java.util.stream.IntStream.of;

class Squarer {
  static int[] squareOrSquareRoot(int[] array) {
    return of(array).map(i -> Math.sqrt(i) % 1 == 0 ? (int) Math.sqrt(i) : i * i).toArray();
  }
}