2015-05-24 4 views
2

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

К сожалению, делать это итеративно довольно сложно. Я понимаю, что решение прост, но я не могу обернуть его вокруг.

Ниже мой код, до сих пор:

public static void main(String[] args) 
{ 
    int[] elements = {0 , 2 , 10 , 3, -3 }; 
    int smallest = 0; 
    int secondSmallest = 0; 

    for (int i = 0; i < elements.length; i++) 
    { 
     for (int j = 0; j < elements.length; j++) 
     { 
      if (elements[i] < smallest) 
      { 
       smallest = elements[i]; 

       if (elements[j] < secondSmallest) 
       { 
        secondSmallest = elements[j]; 
       } 
      } 
     } 

    } 

    System.out.println("The smallest element is: " + smallest + "\n"+ "The second smallest element is: " + secondSmallest); 
} 

Это работает на несколько номеров, но не все. Числа изменяются, потому что внутреннее условие if не так эффективно, как внешнее условие if.

Запрещается перестраивать перегородки.

+1

Вы не должны инициализировать 'smallest' с' 0', если массив может содержать только числа, большие чем это. Попробуйте 'int smallest = Integer.MAX_VALUE' для начала. То же самое касается 'secondSmallest'. – Axel

+0

В качестве альтернативы, 'elements [0]' является подходящей инициализацией для 'smallest' и' secondSmallest', так как это кандидат для наименьшего в массиве. –

ответ

7

Попробуйте этот. Второе условие используется, чтобы поймать событие, когда наименьшее число является первым

int[] elements = {-5, -4, 0, 2, 10, 3, -3}; 
    int smallest = Integer.MAX_VALUE; 
    int secondSmallest = Integer.MAX_VALUE; 
    for (int i = 0; i < elements.length; i++) { 
     if(elements[i]==smallest){ 
      secondSmallest=smallest; 
     } else if (elements[i] < smallest) { 
      secondSmallest = smallest; 
      smallest = elements[i]; 
     } else if (elements[i] < secondSmallest) { 
      secondSmallest = elements[i]; 
     } 

    } 

UPD по @Axel

int[] elements = {-5, -4, 0, 2, 10, 3, -3}; 
    int smallest = Integer.MAX_VALUE; 
    int secondSmallest = Integer.MAX_VALUE; 
    for (int i = 0; i < elements.length; i++) { 
    if (elements[i] < smallest) { 
      secondSmallest = smallest; 
      smallest = elements[i]; 
     } else if (elements[i] < secondSmallest) { 
      secondSmallest = elements[i]; 
     } 

    } 
+2

. Каков ожидаемый результат, когда два числа имеют наименьшее значение? Например, когда 'int [] elements = {-5, -4, 0, 2, 10, 3, -5}'? Должно быть это '-5' или' -4'? Это дает вам «-4». – Axel

+0

под редакцией Кристиана. Thx – nesteant

+0

Не было бы достаточно использовать '=>' вместо '>' во втором 'if'? (О, извините, теперь это третий.) – Axel

1
public static int findSecondSmallest(int[] elements) { 
    if (elements == null || elements.length < 2) { 
     throw new IllegalArgumentException(); 
    } 
    int smallest = elements[0]; 
    int secondSmallest = elements[0]; 
    for (int i = 1; i < elements.length; i++) { 
     if (elements[i] < smallest) { 
      secondSmallest = smallest; 
      smallest = elements[i]; 
     } 
     else if (elements[i] < secondSmallest) { 
      secondSmallest = elements[i]; 
     } 
    } 
    return secondSmallest; 
} 
+0

Этот код не будет работать, если существует элемент '> = smallest', однако' Timo

+0

Также, если первое значение в элементах наименьшее, оно не будет установлено secondSmallest –

0
 public static void main(String[] args) 
{ 
    int[] elements = {-4 , 2 , 10 , -2, -3 }; 
    int smallest = Integer.MAX_VALUE; 
    int secondSmallest = Integer.MAX_VALUE; 

    for (int i = 0; i < elements.length; i++) 
    { 
     if (smallest>elements[i]) 
      smallest=elements[i]; 

    } 

    for (int i = 0; i < elements.length; i++) 
    { 
     if (secondSmallest>elements[i] && elements[i]>smallest) 
      secondSmallest=elements[i]; 

    } 

    System.out.println("The smallest element is: " + smallest + "\n"+ "The second smallest element is: " + secondSmallest); 
} 
+0

, это будет работать и с массивами с дубликатами, такими как int [] elements = {-4, -4, -4, -4, -3}; –

0
try this ... 
first condition checks if both values are less than value in array. 
second condition if value is less than small than smallest=element[i] 
else secondSmallest=elements[i].. 

     public static void main(String[] args) 
     { 
      int[] elements = {0 , 2 , 10 , 3, -3 }; 
      int smallest = elements[0]; 
      int secondSmallest = 0; 

       for (int i = 0; i < elements.Length; i++) 
       { 
        if (elements[i]<smallest || elements[i]<secondSmallest) 
        { 
         if (elements[i] < smallest) 
         { 
          secondSmallest = smallest ; 
          smallest = elements[i]; 

         } 
         else 
         { 
          secondSmallest = elements[i]; 

         } 
        } 
       } 

      System.out.println("The smallest element is: " + smallest + "\n"+ "The second smallest element is: " + secondSmallest); 
     } 
2
int[] arr = { 4, 1, 2, 0, 6, 1, 2, 0 }; 

    int smallest = Integer.MAX_VALUE; 
    int smaller = Integer.MAX_VALUE; 
    int i = 0; 

    if (arr.length > 2) { 
     for (i = 0; i < arr.length; i++) { 

      if (arr[i] < smallest) { 
       smaller = smallest; 
       smallest = arr[i]; 
      } else if (arr[i] < smaller && arr[i] > smallest) { 
       smaller = arr[i]; 
      } 
     } 

     System.out.println("Smallest number is " + smallest); 
     System.out.println("Smaller number is " + smaller); 

    } else { 
     System.out.println("Invalid array !"); 
    } 
} 
+0

Что делать, если массив имеет только значение sigle? int [] arr = {0}, то он терпит неудачу, возвращает Max_VALUE – developer

2

Просто, вы можете сделать это

int[] arr = new int[]{34, 45, 21, 12, 54, 67, 15}; 
Arrays.sort(arr); 
System.out.println(arr[1]); 
0

Вы можете сделать это в O (n) раз. Ниже приведен код Python

def second_small(A): 
    if len(A)<2: 
     print 'Invalid Array...' 
     return 
    small = A[0] 
    second_small = [1] 
    if small > A[1]: 
     second_small,small = A[0],A[1] 

    for i in range(2,len(A)): 
     if A[i] < second_small and A[i]!=small: 
      if A[i] < small: 
       second_small = small 
       small = A[i] 
      else: 
       second_small = A[i] 
    print small, second_small 
A = [12, 13, 1, 10, 34, 1] 
second_small(A) 
0
public static void main(String[] args) { 

    Scanner in = new Scanner(System.in); 
    System.out.println("Enter array size = "); 
    int size=in.nextInt(); 
    int[] n = new int[size]; 
    System.out.println("Enter "+ size +" values "); 

    for(int i=0;i<n.length;i++) 
     n[i] = in.nextInt(); 
    int small=n[0],ssmall=n[0]; 

    // finding small and second small 
    for(int i=0;i<n.length;i++){ 
     if(small>n[i]){ 
      ssmall=small; 
      small=n[i]; 
      }else if(ssmall>n[i]) 
       ssmall=n[i]; 
    } 

    // finding second small if first element itself small 
    if(small==n[0]){ 
     ssmall=n[1]; 
     for(int i=1;i<n.length;i++){ 
      if(ssmall>n[i]){ 
       ssmall=n[i]; 
       } 
     } 
    } 

    System.out.println("Small "+ small+" sSmall "+ ssmall); 

    in.close(); 
} 
0
public static void main(String[] args) { 
    int arr[] = {6,1,37,-4,12,46,5,64,21,2,-4,-3}; 
    int lowest =arr[0]; 
    int sec_lowest =arr[0]; 
    for(int n : arr){ 
     if (lowest > n) 
     { 
      sec_lowest = lowest; 
      lowest = n; 

     } 
     else if (sec_lowest > n && lowest != n) 
      sec_lowest = n; 
    } 

    System.out.println(lowest+" "+sec_lowest); 

    } 
+1

** Из очереди просмотра: ** Могу ли я попросить вас добавить еще немного контекста вокруг вашего ответа. Кодовые ответы трудно понять. Это поможет читателю и будущим читателям, если вы сможете добавить дополнительную информацию в свой пост. –

0

enter image description here

public class SecondSmallestNumberInArray 
     { 
      public static void main(String[] args) 
      { 
       int arr[] = { 99, 76, 47, 85, 929, 52, 48, 36, 66, 81, 9 }; 
       int smallest = arr[0]; 
       int secondSmallest = arr[0]; 

       System.out.println("The given array is:"); 
       boolean find = false; 
       boolean flag = true; 

       for (int i = 0; i < arr.length; i++) 
       { 
        System.out.print(arr[i] + " "); 
       } 

       System.out.println(""); 

       while (flag) 
       { 
        for (int i = 0; i < arr.length; i++) 
        { 
         if (arr[i] < smallest) 
         { 
          find = true; 
          secondSmallest = smallest; 
          smallest = arr[i]; 
         } else if (arr[i] < secondSmallest) { 
          find = true; 
          secondSmallest = arr[i]; 
         } 
        } 
        if (find) { 
         System.out.println("\nSecond Smallest number is Array : -> " + secondSmallest); 
         flag = false; 
        } else { 
         smallest = arr[1]; 
         secondSmallest = arr[1]; 
        } 
       } 
      } 
     } 

    **Output is** 

    D:\Java>java SecondSmallestNumberInArray 

    The given array is: 

    99 76 47 85 929 52 48 36 66 81 9 

    Second Smallest number is Array : -> 36 

    D:\Java> 
+0

объясните это пожалуйста –

+0

Muhammad Muazzam Dry Запустите этот код очень простой шаг Необходимо проверить, выполнено ли другое заявление –

0

Попробуйте это.

public static void main(String args[]){ 
     int[] array = new int[]{10, 30, 15, 8, 20, 4}; 

     int min, secondMin; 

     if (array[0] > array[1]){ 
      min = array[1]; 
      secondMin = array[0]; 
     } 
     else{ 
      min = array[0]; 
      secondMin = array[1]; 
     } 

     for (int i=2; i<array.length; i++){ 
      if (array[i] < min){ 
       secondMin = min; 
       min = array[i]; 
      } 
      else if ((array[i] > min) && (array[i] < secondMin)){ 
       secondMin = array[i]; 
      } 
     } 
     System.out.println(secondMin); 
    } 
Смежные вопросы