Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Олимпиадные задания массивы


Автор: lirkassss 19.10.2022, 23:16
Условия задач:
№2 
Разработайте код определения количества цифр 5 и 7 в массиве. Массив создайте случайными числами в диапазоне [1; 15].

№3
Дан одномерный массив, содержащий n целых чисел. Разработайте код для определения количества чисел больше 5 и меньше 9. Массив создайте случайным образом.

№3
Дан двумерный массив целых чисел размерностью n x m. Разработайте код, с помощью которого положительные числа заменяются нулем. а отрицательные – единицей. Массив создайте случайными числами.

Автор: korob2001 14.5.2023, 05:55
Чувствую задачки с подвохом  smile , но о сортировке ничего не сказано, потому решаются, скорее всего, обычным проходом по всем элементам.
1. Создал два вспомогательных метода, один создаёт массив int[] заданного размера и заполняет его числами в заданном диапазоне. Второй создаёт матрицу int[][], так же заданного размера: 
Код

private static int[][] createRandomNumbersMatrix(int rows, int cols, int randFrom, int randTill) {
    int[][] result = new int[rows][];
    for (int i = 0; i < result.length; i++) {
        result[i] = createRandomNumbersArray(cols, randFrom, randTill);
    }
    return result;
}

private static int[] createRandomNumbersArray(int size, int from, int till) {
    // Возможно при следующих условиях было бы правильнее выбросить
    // исключение, что-то вроде IllegalArgumentException, но я просто
    // инвертирую размер, если он отрицательный и меняю местами значения
    // переменных from и till, если from больше till.
    if (size < 0) size = -size;
    if (from > till) {
        var temp = from;
        from = till;
        till = temp;
    }
    
    var rand = new Random();
    var numbers = new int[size];
    for (int i = 0; i < numbers.length; i++) {
        numbers[i] = rand.nextInt(from, till + 1);
    }
    return numbers;
}

2. Тело метода main:
Код

public static void main(String[] args) {
    // Создаём массив и матрицу
    var numbers = createRandomNumbersArray(10, 1, 15);
    var matrix = createRandomNumbersMatrix(10, 10, -15, 15);
    
    // Задача 1. Ответ в переменной: task1Result
    var task1Result = IntStream.range(0, numbers.length).filter(n -> numbers[n] == 5 || numbers[n] == 7).count();
    
    // Задача 2. Ответ в переменной: task2Result
    var task2Result = IntStream.range(0, numbers.length).filter(n -> numbers[n] > 5 && numbers[n] < 9).count();
    
    // Задача 3. Ответ в двумерном массиве matrix
    for (int i = 0; i < matrix.length; i++) {
        for (int j = 0; j < matrix[i].length; j++) {
            matrix[i][j] = matrix[i][j] >= 0 ? 0 : 1;
        }
    }
}

Автор: LSD 15.5.2023, 23:26
Попридираюсь  smile 

Код можно написать идеоматичней. Генерировать массив можно непосредственно с помощью Random
Код

    private static int[] randomArray(int size, int origin, int bound) {
        return ThreadLocalRandom.current().ints(size, origin, bound).toArray();
    }

    private static int[][] random2DArray(int rows, int cols, int origin, int bound) {
        return IntStream.range(0, rows).mapToObj(__ -> randomArray(cols, origin, bound)).toArray(int[][]::new);
    }



Делать стрим с индексами а потом доставать элементы массива по индексу не нужно, можно сразу стрим по значениям сделать:
Код

var array = randomArray(10, 0, 100);
var count1 = IntStream.of(array).filter(i -> i == 5 || i == 7).count();
var count2 = IntStream.of(array).filter(i -> i > 5 && i < 9).count();



P.S. Какой же некрофилией мы тут занимаемся.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)