Заполнить матрицу треугольником

431
10 сентября 2017, 00:13

решение должно построить пирамиду из заданного входного списка целых значений. Номера сортируются по возрастанию сверху вниз, слева направо.

Пустые пространства заполняются нулями. Чтобы заставить симметричные входные числа пирамиды чередуться с нулями. Входные:

List<Integer> input = Arrays.asList(1, 3, 2, 9, 4, 5);

Выходные:

int[][] expected = new int[][]{
            {0, 0, 1, 0, 0},
            {0, 2, 0, 3, 0},
            {4, 0, 5, 0, 9}};

Мое решение:

public int[][] buildPyramid(List<Integer> inputNumbers) {
    boolean flag;//Флаг для возможности/невозможности построения пирамиды
    int[][]matrix;//Получившаяся матрица
    System.out.println("Введенная последовательность: " + inputNumbers);
    int size = inputNumbers.size();//Проверяем размер полученного массива
    //Проверим, является ли данное число треугольным
    int count = 0;int rows = 1;int cols = 1;
    while(count < size){
       count=count+rows;
       rows++;
       cols=cols+2;
    }
    rows = rows-1;//Актуальное число строк
    cols = cols-2;//Актуальное число столбцов
    if(size==count) {
        flag = true;//Если возможно построить матрицу
    }else flag = false;
    if(flag){
        List<Integer> sorted = inputNumbers.stream().sorted().collect(Collectors.toList());
        System.out.println("Отсортированная последовательность по возрастанию: " + sorted);
        System.out.println("Количество элементов в последовательности: " + size);
        System.out.println("Число столбцов(cols) матрицы будет равно: " + cols);
        System.out.println("Число строк(rows) матрицы будет равно: " + rows);
        System.out.println("*******СТРОИМ МАТРИЦУ*******");
        matrix = new int[rows][cols];//Задаем размерность матрице
        int centr = (cols/2);//Находим центральную точку матрицы
        int i = 1;//ячейка строк
        int c = 1;//счетчик цикла
        count = 0;

//В этом цикле у меня затык, я не понимаю как заполнить его цифрами из последовательности в заданном порядке
        while(i <= rows) {
            while(count < i) {
                matrix[i-1][rows-c] = inputNumbers.get(c-1);
                count++;
                c++;
            }
            count=0;
            i++;
        }
        for(int [] a: matrix)//выводим матрицу на экран
        {
            for(int b: a)
                System.out.print(b+" ");
            System.out.println();
        }
    }//Выбрасываем исключение
    else{
        throw new CannotBuildPyramidException();
    }

    return matrix;
}
Answer 1

Напишу середину (остальное не трогал):

if(flag){
    List<Integer> sorted = inputNumbers.stream().sorted().collect(Collectors.toList());
    System.out.println("Отсортированная последовательность по возрастанию: " + sorted);
    System.out.println("Количество элементов в последовательности: " + size);
    System.out.println("Число столбцов(cols) матрицы будет равно: " + cols);
    System.out.println("Число строк(rows) матрицы будет равно: " + rows);
    /******* ЗАПОЛНЯЕМ МАТРИЦУ НУЛЯМИ *******/
    matrix = new int[rows][cols];//Задаем размерность матрице
    for (int[] row : matrix) {
        Arrays.fill(row, 0);
    }
    /******* СТРОИМ ТРЕУГОЛЬНИК *******/
    int center = (cols / 2);//Находим центральную точку матрицы
    count = 1; // сколько чисел будет в строке
    int arrIdx = 0; // индекс массива
    for (int i = 0, offset = 0; i < rows; i++, offset++, count++) {
        int start = center - offset;
        for (int j = 0; j < count * 2; j +=2, arrIdx++) {
            matrix[i][start + j] = sorted.get(arrIdx);
        }
    }
    /******** ВЫВОДИМ МАТРИЦУ НА ЭКРАН *******/
    for(int [] a: matrix)//выводим матрицу на экран
    {
        for(int b: a)
            System.out.print(b+" ");
        System.out.println();
    }
}//Выбрасываем исключение
else{
     throw new CannotBuildPyramidException();
}

Не знаю, уловите ли смысл. Надо было нарисовать матрицы визуально где-нибудь и по ним представить логику.

Смысл в том, что

  • В каждой строке будет увеличиваться количество цифр: 1,2,3 и т.д. За это отвечает count.
  • Также на каждой строке будет происходить смещение относительно центра для отрисовки цифр center - offset;
  • Отрисовка будет вестись с шагом 2 (j +=2), а так как количество цифр count в таком случае может оказаться меньше шага j, то счетчик будет пробегаться не по количеству count, а count * 2

Скорее всего это можно всё подсократить. Но в целом должно работать

READ ALSO
Как настроить KeyEvent Android

Как настроить KeyEvent Android

Хочу в приложении сделать поддержку некоторых спец клавиш (F1, F2, F3

220
Как к view прикрепить скрытую информацию

Как к view прикрепить скрытую информацию

Допусти есть listView состоящий из textView'sНужно к каждому textView прицепить какие-то данные, но чтобы они не были видны пользователю

215
Как работать с выражениями {val} в @GetMapping(&ldquo;/{val}&rdquo;) в spring?

Как работать с выражениями {val} в @GetMapping(“/{val}”) в spring?

При работе с Spring столкнулся с таким синтаксисом {val} в мапингеВот такой метод:

215
Почему выскакивает ошибка: incompatible types: java.util.HashSet&lt;java.lang.Object&gt; cannot be converted to java.util.Set

Почему выскакивает ошибка: incompatible types: java.util.HashSet<java.lang.Object> cannot be converted to java.util.Set

ЗдравствуйтеЗадание заключается в том, чтобы добавить три элемента во множество HashSet, затем удалить один элемент из него и вывести все это...

253