The challenge

Your task is to programe:

String convertToString(int[] pol) {....} The method returns given by a parameter, (integer array) which represents a polynomial, the representation of the polynomial in String format. NOTE:

1
2
array{a, b, c, d, e,...., z}
      0  1  2  3  4 ....  n

The numbers indicate the grade of the polynomial, where n is a positive integer always. Some examples:

1
2
3
4
5
6
array{0,1,-2,0,5}  -> convertToString(array) -> "5x^4-2x^2+x"
array{1,1,-2,0,0}  -> convertToString(array) -> "-2x^2+x+1"
array{}  -> convertToString(array) -> ""
array{0,0,7,0,0}  -> convertToString(array) -> "7x^2"
array{1,0,0,0,0}  -> convertToString(array) -> "1"
array{0,1,-1,0,5,0,0,1}  -> convertToString(array) -> "x^7+5x^4-x^2+x"

The solution in Java code

Option 1:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import java.util.stream.*;

public class Polinomio{

    static String convertString(final int[] pol){
        final int len = pol.length;
        if (len==0) return "";
        
        return IntStream.range(0, len)
                        .map(      n -> len-1-n )
                        .filter(   n -> pol[n] != 0 )
                        .mapToObj( n -> ""+pol[n] + ( n == 1 ? "x" 
                                                    : n != 0 ? "x^"+n : "") )
                        .collect(Collectors.joining("+"))
                        .replaceAll("\\b1(?=x)|\\+(?=-)", "");
    }
}

Option 2:

1
2
3
4
5
6
7
8
9
import java.util.*;

public class Polinomio{
  static String convertString(int[] pol){
    List<String> res = new ArrayList<String>();
    for(int p=pol.length-1; p>=0; p--) if(pol[p]!=0)res.add((pol[p]<0?'-':res.isEmpty()?"":'+')+(Math.abs(pol[p])==1&&p>0?"":String.valueOf(Math.abs(pol[p])))+(p==0?"":p==1?'x':"x^"+String.valueOf(p)));
    return String.join("",res);
  }
}

Option 3:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import java.util.List;
import java.util.ArrayList;

public class Polinomio {
  static String convertString(int[] a) {
    List<String> lst = new ArrayList<>();
    for(int i = a.length-1; i >= 0; --i)
      if(a[i] != 0) lst.add(Integer.toString(a[i]) + (i > 0 ? "x" : "") + (i > 1 ? "^" + Integer.toString(i) : ""));
    return String.join("+", lst).replaceAll("1(?=x)", "").replaceAll("\\+-", "-");
  }
}

Option 4:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Polinomio{

  static String convertString(int[] pol) {
        if (pol.length > 0) {
            StringBuilder sb = new StringBuilder();
            StringBuilder temp = new StringBuilder();
            sb.append(pol[0] > 0 ? "+" + pol[0] : pol[0] < 0 ? String.valueOf(pol[0]) : "");
            sb.reverse();
            for (int i = 1; i < pol.length; i++) {
                if (pol[i] != 0) {
                    if (pol[i] == 1 || pol[i] == -1) {
                        if (i == 1) {
                            sb.append(pol[i] > 0 ? "x+" : "x-");
                        } else
                            sb.append(pol[i] > 0 ? i + "^x" + "+" : i + "^x" + "-");
                    } else {
                        sb.append(pol[i] > 0 ? i + "^x" + pol[i] + "+" : i + "^x" + temp.append(pol[i]).reverse());
                    }
                }
                temp.delete(0, temp.length() + 1);
            }
            if (sb.reverse().indexOf("+") == 0) {
                sb.deleteCharAt(0);
            }
            return sb.toString();
        }
        return "";
    }
}

Test cases to validate our solution

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import org.junit.Test;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;

public class PolinomioShould{
    @Test
    public void basicTests(){
        assertThat("error when pol={0,1}",Polinomio.convertString(new int[]{0,1}), is("x") );
        assertThat("error when pol={-1,0}",Polinomio.convertString(new int[]{-1,0}), is("-1") );
    }
}

Additional test cases

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
import org.junit.Test;
import java.util.Random;
import java.util.Arrays;
import static org.junit.Assert.assertEquals;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;

public class PolinomioShould {
   

    @Test
    public void test4 (){
        assertThat("error when pol={}",Polinomio.convertString(new int[]{}), is("") );
        assertThat("error when pol={0,1}",Polinomio.convertString(new int[]{0,1}), is("x") );
        assertThat("error when pol={-1,0}",Polinomio.convertString(new int[]{-1,0}), is("-1") );
        assertThat("error when pol={-1,0,0,0,0,0}",Polinomio.convertString(new int[]{-1,0,0,0,0,0}), is("-1") );
        assertThat("error when pol={-1,1,1}",Polinomio.convertString(new int[]{-1,1,1}), is("x^2+x-1") );
        assertThat("error when pol={3,0,2}",Polinomio.convertString(new int[]{3,0,2}),is("2x^2+3"));
        assertThat("error when pol={0,-1,0,0,3}",Polinomio.convertString(new int[]{0,-1,0,0,3}), is("3x^4-x"));
        assertThat("error when pol={0,1,-2,4,0,0,-1,1}",Polinomio.convertString(new int[]{0,1,-2,4,0,0,-1,1}), is("x^7-x^6+4x^3-2x^2+x"));
        assertThat("error when pol={1,1,-2,4,0,0,-1,1}",Polinomio.convertString(new int[]{1,1,-2,4,0,0,-1,1}), is("x^7-x^6+4x^3-2x^2+x+1"));
        assertThat("error when pol={1,0,0,0,0,0}",Polinomio.convertString(new int[]{1,0,0,0,0,0}), is("1"));
    }
    
    @Test
    public void randomTests(){
        Random rnd = new Random();
        Polinomiop po=new Polinomiop();
        
        for(int j=0; j<25; j++){
          int[] pol = new int[(int) (rnd.nextDouble() * 10 + 0)];
          
          for(int i=0; i<pol.length; i=i+2)
              pol[i]=((int) (rnd.nextDouble() * 10 -rnd.nextDouble()*10));
              
          
          assertEquals("error when pol = "+Arrays.toString(pol),
                            po.convertString(pol), Polinomio.convertString(pol));
       }
    }
    

}
 class Polinomiop {
    static String convertString(int[] pol){
        String result="";
        for(int i = pol.length-1; i>=0; i--) {

            if (pol[i] == 0){
                continue;
            }
            if (i == 0) {
                if (pol[i] < 0) {
                    result += "" + pol[i];
                } else {
                    if(result.isEmpty()){
                        result+=pol[i];
                        continue;
                    }
                    result += "+" + pol[i];
                }
                continue;
            } else if (i == pol.length - 1) {
                if (pol[i] > 0) {
                    if (i == 1){
                        result += "" + dame(pol[i]) + "x";
                        continue;
                    }
                    result += "" + dame(pol[i]) + "x^" + i;
                } else {
                    if (i == 1){
                        result += dame(pol[i]) + "x";
                        continue;
                    }
                    result += "" + dame(pol[i]) + "x^" + i;
                }
                continue;
            }
            if (pol[i] < 0){
                
                if(i==1){
                    result += dame(pol[i]) + "x";
                    continue;
                }
                result += dame(pol[i]) + "x^" + i;
                continue;
            }
            if(i==1){

                result += "+" + dame(pol[i])+ "x";
                continue;
            }
            if(result.isEmpty()){
                result += "" + dame(pol[i])+ "x^" + i;
                continue;
            }

            result += "+" + dame(pol[i])+ "x^" + i;
        }
        return result;
    }

    private static String dame(int n){
        if(n<0){
            return n==-1 ? "-":n+"";
        }else{
            return n==1 ? "":n+"";
        }
    }
}