Найти "уникальную" строку в массиве

226
13 марта 2022, 02:50

Задача следующая:

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

Пример:

[ [10, 2, 3], [-1, 4, 5], [6, 10, 1] ] -> вернет строку 1

Написал код, используя множество HashSet. Для данного примера метод работает, но к примеру для массива : [ [12, 2, 3], [-1, 4, 5], [6, 10, 1]] -> возвращает строку 2, хотя должна быть 0.

Фрагмент кода:

static int findUniqueRow(int[][] array) {
    HashSet<Integer> set = new HashSet<>();
    int index = -1;
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[i].length; j++) {
            if (!set.contains(array[i][j])) {
                set.add(array[i][j]);
            } else return index;
        }
        index = i;
    }
    return index;
}
Answer 1

для небольшого набора данных это разницы не имеет, но если, например, важна скорость, но не важна память, можно сделать как то так

static int findUniqueRow(int[][] array) {
    HashMap<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[i].length; j++) {
            int k = array[i][j];
            if (map.containsKey(k)) map.put(k, map.get(k) + 1);
            else map.put(k, 1);
        }
    }
    HashMap<Integer, Integer> line = new HashMap<>();
    for (int i = 0; i < array.length; i++) {
        line.clear();
        for (int j = 0; j < array[i].length; j++) {
            int k = array[i][j];
            if (line.containsKey(k)) line.put(k, line.get(k) + 1);
            else line.put(k, 1);
        }
        boolean match = true;
        for (int key : line.keySet()) {
            if (line.get(key) != map.get(key)) {
                match = false;
                break;
            }
        }
        if (match) return i;
    }
    return -1;
}
Answer 2

Код работает не верно! он не проверяет уникальность строк между собой, а уникальность каждого элемента в массиве! В первом вернет один потому что когда цикл дойдет до 10 в 3 ряду, то вернет index который равен 1. Во втором случае цикл завершает свою работу, потому что в массиве все элементы уникальны.

static int findUniqueRow(int[][] array) {
    for (int i = 0; i < array.length; i++) {
        boolean isUnique = true;
        for (int j = 0; j < array[i].length && isUnique; j++) {
            for (int k = 0; k < array.length && isUnique; k++) {
                if (k == i) {
                    continue;
                }
                for (int v = 0; v < array[k].length; v++) {
                    if (array[i][j] == array[k][v]) {
                        isUnique = false;
                        break;
                    }
                }
            }
        }
        if (isUnique) {
            return i;
        }
    }
    return -1;
}

Наверно можно было сделать и красивей, однозначно можно было бы исключать строки с найденими не уникальными элементами и не проверять их каждый раз - но и так сойдет) ... для массива 3х3

READ ALSO
как после прочтения текстового файла в webView занести информацию в sqlite андройд

как после прочтения текстового файла в webView занести информацию в sqlite андройд

у меня есть файл txt в первичной внешней памяти(не съемной)андройдая вывожу текст в webView как мне его положить в базу данных sqlite? пишут что то про...

173
Реализация сервера на Java

Реализация сервера на Java

У меня есть приложение на Java, которое реализует многопоточный локальный сервер и также умеет брать значения из базы данных MySQL(также локальной)Вопрос...

207
Java. Массив строк. Найти самое длинное слово

Java. Массив строк. Найти самое длинное слово

JavaНайти самое длинное общее слово двух заданных предложений

124
Проверка версии файла

Проверка версии файла

Есть приложение, которое с помощью json берет данные из txt файла Файл хранится в директории Android/data и скачивается с сервера Есть ли какие-то готовые...

96