Найти ответы in Java
-
- Уже с Приветом
- Posts: 143
- Joined: 29 Apr 2014 12:22
-
- Уже с Приветом
- Posts: 143
- Joined: 29 Apr 2014 12:22
Re: Найти ответы in Java
А если на i = 0 получим min = 0 зачем бежать дальше?brrdrr wrote: 19 Dec 2019 23:17 Вот тоже задачка на Java.
Имеется array и нужно найти минимальную разницу между его членами.
Так решение выглядит без стрима.Code: Select all
public class Solution { static int minimumAbsoluteDifference(int[] arr) { int min = Integer.MAX_VALUE; Arrays.sort(arr); for( int i = 0; i < arr.length - 1; i++){ min = Math.min(Math.abs(arr[i] - arr[i + 1]), min); } return min; }
![HBZ :pain1:](./images/smilies/pain25.gif)
-
- Уже с Приветом
- Posts: 549
- Joined: 07 Jan 2016 13:04
Re: Найти ответы in Java
Можно так:
UPD:
Я короче, перечитал и понял, что вопрос был про сортировку. Это сделать можно, создав отдельный класс, который содержит указатель на массив и на позицию в этом массиве. Далее просто реализовать два метода:
- один, возвращающий значение массива
- второй, возвращающий разницу до следующего элемента
Только это в принципе плохая идея, когда элементы стрима знают друг о друге. Сортировка стрима тоже не особо хорошая идея во многих случаях, т.к. параллельный стрим не может быть отсортированным.
Code: Select all
public class Solution {
public static void main(String[] args) {
var test = new int[]{1, 10, 12, 30};
System.out.println(solve(test)); // 2
}
public static int solve(int[] arr) {
IntFunction<Integer> fn = (i) -> Math.abs(arr[i] - arr[i + 1]);
return IntStream.range(0, arr.length - 1).map(fn::apply).min().orElseThrow();
}
}
Я короче, перечитал и понял, что вопрос был про сортировку. Это сделать можно, создав отдельный класс, который содержит указатель на массив и на позицию в этом массиве. Далее просто реализовать два метода:
- один, возвращающий значение массива
- второй, возвращающий разницу до следующего элемента
Только это в принципе плохая идея, когда элементы стрима знают друг о друге. Сортировка стрима тоже не особо хорошая идея во многих случаях, т.к. параллельный стрим не может быть отсортированным.
-
- Posts: 2
- Joined: 20 Dec 2019 22:54
Re: Найти ответы in Java
Это задача на алгоритмы. Решение без сортирoвки 0(n). С потоком тоже работает
-
- Уже с Приветом
- Posts: 2273
- Joined: 29 Jul 2005 17:39
- Location: Калифорнийский Мухосранск
Re: Найти ответы in Java
Извините, что влезаю, но, так сказать чисто из любви к искусству - у вас горизонт завален ваш код ломается на массивах из одного элемента.
Ну и еше весьма интересным получается значение минимальной разницы для массивов типа таких { Integer.MIN_VALUE + 100, Integer.MAX_VALUE - 100 }.
Ну и еше весьма интересным получается значение минимальной разницы для массивов типа таких { Integer.MIN_VALUE + 100, Integer.MAX_VALUE - 100 }.
-
- Уже с Приветом
- Posts: 13722
- Joined: 16 Jan 2001 10:01
Re: Найти ответы in Java
Вот что у меня получилось пока:brrdrr wrote: 19 Dec 2019 23:17 Вот тоже задачка на Java.
Имеется array и нужно найти минимальную разницу между его членами.
Code: Select all
package org.pal.stream;
import java.util.stream.Stream;
public class ConsumEx {
public static void main(String[] a) {
Stream<Integer> s1 = Stream.of(1, 5, 3, 11, 10);
Res r = s1.sequential().sorted().collect(() -> new Res(), (res, i) -> {
res.fmin(i);
}, (res, res2) -> {
//todo: combiner
});
System.out.println(r.diff);
}
static class Res {
Integer prev;
Integer diff;
public void fmin(Integer i) {
if (prev != null) {
int newDiff = i - prev;
if (diff == null || newDiff < diff) {
diff = newDiff;
}
}
prev = i;
}
}
}
-
- Уже с Приветом
- Posts: 549
- Joined: 07 Jan 2016 13:04
Re: Найти ответы in Java
Возможно, в меня сейчас полетят тонны комментариев, но ломаться -- это нормальное поведение кода. Допустим мне надо выполнить цепочку функций над элементами стрима, то если любой оператор не будет выполнен по любой причине, это уже повод остановить обработку и вылететь наверх из стека с эксепшн. С ручными проверками даже если я и выиграю несколько наносекунд, я все равно буду вынужден бросить эксепшн. Просто, обычно любая обработка подобного рода исключений внутри логики обработки стрима приводит к разным вариантам хардкода или анальным трюкам с депенденси инжекшн.KinDzaDza wrote: 21 Dec 2019 01:44Извините, что влезаю, но, так сказать чисто из любви к искусству - у вас горизонт завален ваш код ломается на массивах из одного элемента.
-
- Уже с Приветом
- Posts: 143
- Joined: 29 Apr 2014 12:22
-
- Уже с Приветом
- Posts: 13722
- Joined: 16 Jan 2001 10:01
Re: Найти ответы in Java
Ломается в данном случае задача (не применима к единственному элементу)
Задача кода по возможности адекватно сообщить почему он сломался.
Задача кода по возможности адекватно сообщить почему он сломался.
-
- Уже с Приветом
- Posts: 13722
- Joined: 16 Jan 2001 10:01
Re: Найти ответы in Java
Кстати, тут я погорячился:
Во всяком случае с сортировкой.
Может я чего-то не догоняю...
Никакого туду с параллельным коллектором не получается.
Во всяком случае с сортировкой.
Может я чего-то не догоняю...
-
- Уже с Приветом
- Posts: 13722
- Joined: 16 Jan 2001 10:01
Re: Найти ответы in Java
Вот что получилось. Не очень fancy, но работает с параллельными не сортированными потоками:
Code: Select all
package org.pal.stream;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
public class ConsumEx {
public static void main(String[] a) {
MinDiffFinder collect = List.of(10, 40, 500, 444, 23, 525, 334, 356, 35, 93, 32, 44, 123, 53, 130, 21)
.parallelStream()
.collect(MinDiffFinder::new,
MinDiffFinder::accum, MinDiffFinder::combine);
System.out.println(collect.minDiff);
}
static class MinDiffFinder {
int minDiff = Integer.MAX_VALUE;
SortedSet<Integer> set = new TreeSet<>();
void accum(Integer i) {
if (set.isEmpty()) {
set.add(i);
} else {
if (minDiff != 0) {
if (set.contains(i)) {
minDiff = 0;
} else {
SortedSet<Integer> headSet = set.headSet(i);
if (! headSet.isEmpty()) {
int headDiff = i - headSet.last();
if (headDiff < minDiff) {
minDiff = headDiff;
}
}
SortedSet<Integer> tailSet = set.tailSet(i);
if (! tailSet.isEmpty()) {
int tailDiff = tailSet.first() - i;
if (tailDiff < minDiff) {
minDiff = tailDiff;
}
}
set.add(i);
}
}
}
}
void combine(MinDiffFinder other) {
if (other.minDiff == 0) {
minDiff = 0;
} else {
for (Integer i: other.set) {
accum(i);
}
}
}
}
}
-
- Уже с Приветом
- Posts: 10399
- Joined: 04 Feb 2004 14:14
- Location: Edgewater, NJ
Re: Найти ответы in Java
Не думаю, что такое возможно с O(n) в данном случае.first1 wrote: 20 Dec 2019 22:59 Это задача на алгоритмы. Решение без сортирoвки 0(n). С потоком тоже работает
-
- Posts: 2
- Joined: 20 Dec 2019 22:54
Re: Найти ответы in Java
Максимальная разница между элементами массива - это разница между максимальным и минимальным элементами. Про сортировку в условии задачи ничего не сказано.
-
- Уже с Приветом
- Posts: 10399
- Joined: 04 Feb 2004 14:14
- Location: Edgewater, NJ
Re: Найти ответы in Java
Если расмматривать первоначальную задачу, то да, можно. Но со второй страницы народ обсуждает уже следующую задачу «найти минимальную разницу между элементами массива».first1 wrote: 27 Dec 2019 04:39 Максимальная разница между элементами массива - это разница между максимальным и минимальным элементами. Про сортировку в условии задачи ничего не сказано.
-
- Уже с Приветом
- Posts: 2643
- Joined: 19 Jun 2003 20:22
- Location: USA
Re: Найти ответы in Java
найти минимальную разницу между максимальными элементами массива, с минимальными затратами, и максимально быстро!IvanGrozniy wrote: 27 Dec 2019 13:06Если расмматривать первоначальную задачу, то да, можно. Но со второй страницы народ обсуждает уже следующую задачу «найти минимальную разницу между элементами массива».first1 wrote: 27 Dec 2019 04:39 Максимальная разница между элементами массива - это разница между максимальным и минимальным элементами. Про сортировку в условии задачи ничего не сказано.