Аватар для AleKr
0 / 0 / 0
Регистрация: 01.01.2018
Сообщений: 21

Поиск в одном массиве элементов, которых нет в другом массиве

04.01.2019, 10:14. Показов 13274. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите, пожалуйста, не могу догадаться как исправить код, чтоб вывел решение следующей задачи:

Даны 2 отсортированных массива.
Найти все элементы в 1-м массиве, которых нет во 2-м.
Пример:
Массив 1- [1, 2, 3, 4], Массив 2- [2, 4, 6, 8]
Ответ- 1, 3

Вот таким образом начал решение задачи, но сравнивает все элементы массивов не посредственно друг с другом:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int[] array1 = {1, 2, 3, 4}; 
int[] array2 = {2, 4, 6, 8}; 
 
for (int i=0; i < array1.length; i++) { 
 
for(int j=0; j < array2.length; j++) { 
System.out.print("i =" + array1[i] + " j =" + array2[j] + "; "); 
 
if (array1[i] != array2[j]) { System.out.print("*_"+array1[i]+"_*; "); } 
 
} System.out.println(); 
} 
} 
}
ответ —>
i =1 j =2; *_1_*; i =1 j =4; *_1_*; i =1 j =6; *_1_*; i =1 j =8; *_1_*;
i =2 j =2; i =2 j =4; *_2_*; i =2 j =6; *_2_*; i =2 j =8; *_2_*;
i =3 j =2; *_3_*; i =3 j =4; *_3_*; i =3 j =6; *_3_*; i =3 j =8; *_3_*;
i =4 j =2; *_4_*; i =4 j =4; i =4 j =6; *_4_*; i =4 j =8; *_4_*;

Может кто нибудь подсказать как его доработать
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.01.2019, 10:14
Ответы с готовыми решениями:

В одном методе список доступен, в другом - нет
Почему в одном методе list доступен, а другом - нет? import java.util.Arrays; import java.util.ArrayList; import...

Поиск повторяющихся элементов в массиве
Необходимо посчитать количество строк, не содержащих повторяющиеся элементы массива. Не понимаю в чем ошибка, неверно считает строки....

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

25
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,745
Записей в блоге: 14
05.01.2019, 15:33
Студворк — интернет-сервис помощи студентам
С использованием Stream-API:

Java
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
import java.util.*;
import java.util.stream.*;
import java.lang.*;
import java.io.*;
 
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static int [] diff(int [] ar1, int [] ar2)
    {
        int n=ar2.length;
        int start=ar2[0], fin=ar2[n-1]; // границы фильтрации (второй массив сам по себе и не нужен!)
        IntStream st_ar1 = Arrays.stream(ar1);
        return st_ar1.filter(x -> x<start || x > fin).toArray();
              
    }
    public static void main (String[] args) throws java.lang.Exception
    {
        int [] ar1={1,2,3,4,5,6,7,23,24};
        int [] ar2={7,8,9,10,11};
        int [] r=diff(ar1,ar2);
        for(int i=0; i<r.length; i++) System.out.print(r[i]+" ");
    }
 
}

https://ideone.com/Kd6Vyy

Добавлено через 10 минут
Цитата Сообщение от ViktorFX Посмотреть сообщение
Как и мой
- а почему он так странно назван? Indexs - индексы? И - главное - зачем Вы каждый элемент первого массива сравниваете с каждым - второго? Ведь оба массива отсортированы. А это значит, что произвольный элемент первого массива "годится" в одном из двух случаев:

- он меньше первого эл-та a2
- он больше последнего эл-та a2

Второй цикл не нужен! Я уже не говорю о том, что Вы взяли под массив Indexs лишнюю память. Если возвращать весь массив, то у пользователя Вашего кода возникнет вопрос: где кончается область реальных элементов?
1
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
05.01.2019, 15:58
Цитата Сообщение от Catstail Посмотреть сообщение
И - главное - зачем Вы каждый элемент первого массива сравниваете с каждым - второго?
Потому что будет неправильно при определенный массивах.
Вот некорректный результат работы ваших методов :
Java
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
import java.util.Arrays;
import java.util.stream.IntStream;
 
 /*
     Поиск в одном массиве элементов, которых нет в другом массиве 
*/
public class HasOneUnique{
 
    public static void main(String[] args){
        int[] ar1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int[] ar2 = {2, 4, 6, 8, 10, 12, 14, 16};
        System.out.println("_____MyStream__________");
        IntStream.range(0,ar1.length)
                .filter(i -> IntStream.range(0,ar2.length).filter(j -> (ar1[i] == ar2[j])).count() == 0)
                .forEach(i -> System.out.println("ar1["+i+"]="+ar1[i]));
        System.out.println("_____getUnique__________");
        System.out.println(Arrays.toString(getUnique(ar1,ar2)));
        System.out.println("_____diff__________");
        System.out.println(Arrays.toString(diff(ar1,ar2)));
        System.out.println("_____diffStream__________");
        System.out.println(Arrays.toString(diffStream(ar1,ar2)));
    }
    public static int[] getUnique(int[] a1, int[] a2) {
        boolean isUnique = false;
        int count = 0;
        int[] indexs = new int[a1.length];
        for(int i=0; i<a1.length; i++) {
            for(int j=0; j<a2.length; j++) {
                if(a1[i] < a2[j] && j > 0) break; 
                if(a1[i] == a2[j]) {
                    isUnique = false; break;
                }
                isUnique = true;
            }
            if(isUnique) {
                indexs[count] = a1[i];
                count++;
            }
        }
        return indexs;
    }
    // from cyber
    public static int [] diff(int [] ar1, int [] ar2){
        int n=ar1.length;
        int [] res;
        int i,k=0;
        i=ar2.length;
        int min=ar2[0],max=ar2[i-1];
        for (i=0; i<n; i++){
            if ((ar1[i] < min) || (ar1[i] > max)) k++;
        }
        res=new int[k];
        k=0;
        for (i=0; i<n; i++){
            if ((ar1[i] < min) || (ar1[i] > max)) res[k++]=ar1[i];
        }
        return res;
    }
    // from cyber again
    public static int [] diffStream(int [] ar1, int [] ar2){
        int n=ar2.length;
        int start=ar2[0], fin=ar2[n-1]; // границы фильтрации (второй массив сам по себе и не нужен!)
        IntStream st_ar1 = Arrays.stream(ar1);
        return st_ar1.filter(x -> x<start || x > fin).toArray();
    }
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
_____MyStream__________
ar1[0]=1
ar1[2]=3
ar1[4]=5
ar1[6]=7
ar1[8]=9
_____getUnique__________
[1, 3, 5, 7, 9, 0, 0, 0, 0, 0]
_____diff__________
[1]
_____diffStream__________
[1]
Кстати, мой getUnique() тоже "лажевый", но при более редких случаях, но я его не исправлял т.к. он пока лучше diff-ов.
А вот мой стрим вроде нормальный.

Добавлено через 7 минут
Цитата Сообщение от Catstail Посмотреть сообщение
Вы взяли под массив Indexs лишнюю память.
Это потому что я не знаю наперед сколько там будет уникальных символов, а вы предполагаете что значения второго массива непрерывны, и не смотрите на все что между его минимумом и максимумом. Потому вы и не "перебираете" такие возможности и "знаете" наперед размер результирующего массива. А как показывает практика это приводит вас к ошибкам.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
05.01.2019, 16:23
Java
1
int[]res = Arrays.stream(ar1).filter(x->!Arrays.stream(ar2).boxed().collect(Collectors.toList()).contains(x)).toArray();
2
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,745
Записей в блоге: 14
05.01.2019, 16:58
ViktorFX, да, признаю. Ваша правда, а я позорно ощибся...

Тогда чуть сложнее.

Java
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
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
    public static int [] diff(int [] ar1, int [] ar2)
    {
        int n1=ar1.length,n2=ar2.length;
        int [] res;
        int i,k,a,b,c;
        int min=ar2[0],max=ar2[n2-1];
        boolean flg;
        
        int [] tmp=new int [n1];
        
        k=0;
        for (i=0; i<n1; i++)
        {
            if ((ar1[i] < min) || (ar1[i] > max))
            {
               tmp[k++]=ar1[i];
            }
            else
            {
                      // Двоичный поиск гораздо быстрее прямого перебора!
                a=0; 
                b=n2-1;
                if (ar2[a]==ar1[i] || ar2[b]==ar1[i]) 
                   flg=true;
                else
                {
                  flg=false;
                  while(b-a>1)
                  {
                    c=(a+b)/2;
                    if (ar2[c]==ar1[i]) 
                    {
                        flg=true;
                        break;
                    }
                    if (ar2[c] > ar1[i])
                    {
                        b=c;
                    }
                    else
                    {
                        a=c;
                    }
                  }
                }  
                if (! flg) tmp[k++]=ar1[i];
            }
        }
        
        res=new int[k];
        
        for (i=0; i<k; i++)
        {
            res[i]=tmp[i];
        }
        return res;
    }
    public static void main (String[] args) throws java.lang.Exception
    {
        int [] ar1={1,2,3,4,5,6,7,10,15};
        int [] ar2={1,7,8,9,10,11,};
        int [] r=diff(ar1,ar2);
        for(int i=0; i<r.length; i++) System.out.print(r[i]+" ");
    }
}
https://ideone.com/SuMwco

Добавлено через 1 минуту
iSmokeJC, Ваш код очень лаконичен, но учитывает ли он тот факт, что массивы отсортированы?
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
05.01.2019, 17:14
Catstail,
1
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
05.01.2019, 17:26
Цитата Сообщение от Catstail Посмотреть сообщение
учитывает ли он тот факт, что массивы отсортированы
Вообще без разницы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.01.2019, 17:26
Помогаю со студенческими работами здесь

Определить количество элементов в массиве, значения которых больше первого элемента
Задан массив, состоящий из 15 элементов вещественного типа. Определить количество элементов, значения которых больше первого элемента. ...

Найти сумму тех элементов массива которых нет в другом массиве
Задано два одномерных массива {bi} и {di}(i=1,2,...,n). Найти сумму тех элементов массива {bi} которых нету в массиве {di}.

Вычесть два массива, если в одном массиве больше элементов, чем в другом
Здраствуйте! Сижу изучаю одномерные массивы, но зашел в тупик на счет вычитания массивов... Для вас это конечно просто, но я чего-то не...

Найти в массиве X наименьший элемент среди тех, которых нет в массиве Y
Доброго времени суток с; Заданы целочисленные массивы X(n) и Y(m), каждый из которых содержит неповторяющиеся элементы. Найти в...

Оставить в первом массиве только те элементы, которых нет во втором массиве
Даны 2 массива вещественных чисел A, B. Оставить в первом массиве только те элементы, которых нет во втором массиве. Заранее спасибо,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

Новые блоги и статьи
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru