Tuesday, 16 April 2019

split number into it's digits

package sam.numbers;

import java.util.Arrays;

public class SplitNumber {

    public static int[] split(int num) {
        if(num <  10 && num > -10)
            return new int[]{num};
        
        boolean negative = num < 0;
        num = Math.abs(num);
        
        int[] split;
        
        if(num < 100)
            split = new int[2];
        else if(num < 1000)
            split = new int[3];
        else if(num < 10000)
            split = new int[4];
        else 
            split = new int[10];
        
        int k = 0;
        
        while(num > 0) {
            if(k >= split.length)
                Arrays.copyOf(split, split.length + split.length/2 );
            
            split[k++] = num % 10;
            num /= 10;
        }
        
        if(k != split.length)
            split = Arrays.copyOf(split, k);
        
        for (int i = 0, j = split.length - 1; i < j; i++, j--) {
            int t = split[i];
            split[i] = split[j];
            split[j] = t;
        }

        if(negative)
            split[0] = -1 * split[0];
        
        return split;
    }
}


    @Test
    void test() {
        check(1, 1);
        check(-1, -1);
        
        check(-11, -1, 1);
        check(11, 1, 1);
        
        check(-123, -1, 2, 3);
        check(123, 1, 2, 3);
        
        check(-1234, -1, 2, 3, 4);
        check(1234, 1, 2, 3, 4);
        
        check(-1234567, -1, 2, 3, 4,5,6,7);
        check(1234567, 1, 2, 3, 4,5,6,7);
    }

    private void check(int i, int... expected) {
        int[] actual = SplitNumber.split(i);
        
        System.out.printf("%-10s%s\n", i, Arrays.toString(actual));
        assertArrayEquals(expected, actual);
    }


1         [1]
-1        [-1]
-11       [-1, 1]
11        [1, 1]
-123      [-1, 2, 3]
123       [1, 2, 3]
-1234     [-1, 2, 3, 4]
1234      [1, 2, 3, 4]
-1234567  [-1, 2, 3, 4, 5, 6, 7]
1234567   [1, 2, 3, 4, 5, 6, 7]

No comments:

Post a Comment