2014-01-22 3 views
0

Найти второе наименьшее и второе по величине значение набора чисел. Решение должно быть таким, чтобы эти значения находились за один проход ввода. Набор ввода может быть пустым или может быть довольно большим: размер неизвестен априори.Найти второе наименьшее и второе по величине значение набора чисел в Java

Можете ли вы, ребята, помочь мне с блок-схемой и псевдокодом? Благодаря достижениям в

Моя текущая блок-схема выглядит следующим образом:

enter image description here

+2

жаль, что мы помогаем, если вы что-то пробовали. Если да, то разместите свой код, четко указав, с какими проблемами вы столкнулись. – SpringLearner

+0

Знает ли ваш учитель, что вы здесь? – csmckelvey

+0

@JqueryLearner. Я думал, что я буду сортировать набор чисел от наименьшего до самого большого, а затем значение, стоящее после наименьшего значения, будет вторым наименьшим значением, то же самое со вторым по величине значением, стоящим перед самым большим значением, будет второе по величине значение. если есть какой-то дубликат, то будет продолжаться до получения нового значения.BTW, мне не нужно делать какой-либо код, просто получайте идею рисовать блок-схему и писать псевдокод. – BBKay

ответ

0

Если вы хотите, чтобы он в один проход, имеющий входы в отсортированном порядке будет легко. Если в порядке сортировки, вы можете просто найти размер, а затем использовать позиции [1] и [n-1], чтобы найти свои номера.

Примечание: индекс начинается с 0

Кроме того, если вы используете карту или какой-то формат, который не даст повторяющиеся значения, то вы можете сразу получить значения. Нет необходимости в повторной проверке. Таким образом, вы можете решить это за один проход.

0
public class SortingNo { 
static int[] removeDuplicates(int arr[]) {  
    java.util.HashSet<Integer> set = new java.util.HashSet<>(); 
    final int len = arr.length; 
    for(int i = 0; i < len; i++){ 
     set.add(arr[i]); 
    } 
    int[] whitelist = new int[set.size()]; 
    int i = 0; 
    for (java.util.Iterator<Integer> it = set.iterator(); it.hasNext();) { 
     whitelist[i++] = it.next(); 
    } 
    return whitelist; 
} 

public static void main(String[] args) {   
    int arr[]={2,2,45,5,78,8,78,23};   
    arr=removeDuplicates(arr);   
    java.util.Arrays.sort(arr);//Sorts the specified array of objects into ascending order   
    System.out.println("Smallest:"+arr[0]);   
    System.out.println("2nd Smallest:"+arr[1]); 
    System.out.println("Largest:"+arr[arr.length-1]); 
    System.out.println("2nd Largest:"+arr[arr.length-2]); 
} 
} 
+0

(Я знаю, я сделал этот комментарий к другому ответу, но я думаю, что это применимо и здесь) Я думаю, позвонив в Arrays.sort(), вы не отвечаете требованиям делать это «за один проход» (за один проход для меня подразумевается, что это должна быть операция O (N) - любой алгоритм сортировки [кроме, возможно, основанного на основе оснований] было бы, по крайней мере, O (n log n) и проверять каждый элемент более одного раза. – JVMATL

0
private static int[] getSecondMinAndMax(int[] in) { 
    if (in == null) 
     return new int[0]; 

    Arrays.sort(in); 

    if (in.length > 3) { 
     return new int[]{in[1], in[in.length-2]}; 
    } else if (in.length == 3) { 
     return new int[]{in[1], in[1]}; 
    } else { 
     return new int[0]; 
    } 
} 
+0

Я думаю, что, вызывая Arrays.sort(), вы не выполняете требование сделать это за один проход (за один проход, для меня подразумевается, что это должна быть операция O (N) - любой алгоритм сортировки [кроме, возможно, сортировки на основе оснований] должен быть как минимум O (n log n), и рассматривать каждый элемент более одного раза. – JVMATL

0

Я думаю, что другие ответы отсутствуют точки; если вам нужно сделать это «за один проход», то сначала вызов алгоритма сортировки будет означать более одного прохода через данные. То же самое для ввода данных в упорядоченный набор и т.д.

Это не полный ответ, но широкий намек ..

Чтобы решить эту проблему, подумайте о том, как вы бы решить более простую задачу: рассмотреть, как вы найдет наибольшее значение за один проход - вы начинаете с первого значения в списке, а затем просматриваете список по одному - каждый раз, когда вы видите большее значение, чем ваше текущее значение, вы отказываетесь от предыдущего наибольшее значение и сохранить новый. Пока вы просматриваете свой список, вы также можете сравнить его с наименьшим значением и заменить свое текущее наименьшее значение новым меньшим значением. Когда вы дойдете до конца списка, вы нашли бы самый большой и самый маленький за один проход.

Теперь подумайте о том, как вы могли бы расширить эту логику, чтобы найти второй по величине объект: что вы проверяете каждый раз, когда смотрите новый номер? это больше, чем ваше наибольшее число? это больше, чем ваш второй по величине? и т. д.

Обновление: вам понадобится сделать специальную логику для списка с менее чем двумя элементами в нем: вопрос не имеет смысла для списка с длиной < 2, так что это зависит от вас решить, что делать с этими ресурсами. (т. е. что бы ваш учитель хотел увидеть?)

Смежные вопросы