2013-11-14 3 views
0

После нахождения наивысшей цифры в номере, как найти вторую самую высокую цифру на этом же номере, используя только циклы и операторы if?найти наивысшую и вторую самую высокую цифру в числе

public static int maximum(int max){ 

while(num != 0){ 
      int rightDigit = num % 10; 
      num /= 10; 
      if(rightDigit > max) 
       rightDigit = max; 
     } 
     return max; 
     } 
+0

Единственный путь сделать это в одном цикле будет хранить список всех значений, сортировать их и тянуть два довершение. – christopher

+0

Итак, вы пытаетесь получить '7' и' 5' из '125673'? Кроме того, вы проверяете дубликаты? –

+1

ваш цикл while не будет доступен, поскольку num = 0. – Sionnach733

ответ

3

Используйте List для хранения всех цифр и sort его, таким образом, вы имеете доступ к самым высоким, второй от высокой к низкой цифры, как вы хотите. Для сортировки List использования Collections.sort(List list)

+0

Учитывая, что он имеет дело с ints (которые имеют максимальную длину 10), это далеко самое простое решение. –

+0

Это наиболее практично, пока ОП не просит домашней работы. – Ron

+0

Я подумывал добавить еще одно решение со второй переменной, но в конечном итоге подумал, что для количества цифр это действительно просто закончится едва заметным грязным кодом, и это намного более чистое с точки зрения дизайна – LionC

0
int largest = 0; 
int secondLargest = 0; 

public static void minAndMax(int n){ 

    int num = n; 
    int currentNum = 0; 

    while(num % 10 != 0){ 
     currentNum = num % 10; 

     if(currentNum > secondLargest) { 
      secondLargest = currentNum; 
     } 
     if(secondLargest > largest) { 
      largest = secondLargest; 
     } 
     num /= 10; 
    } 
} 
0

Является ли это то, что вы хотите? первый элемент в массиве наибольший, второй - второй по величине. Возвращает -1, если нет такого элемента.

public static void main(String[] args) { 
    int[] tab = maximum(12); 
    System.out.println("Largest digit: " + tab[0]); 
    System.out.println("Second largest digit: " + tab[1]); 
} 
public static int[] maximum(int max){ 
    int num = max; 
    int largest = -1; 
    int secondLargest = -1; 
    while(num != 0){ 
     int rightDigit = num % 10; 
     num /= 10; 

     if(rightDigit > largest) { 
      secondLargest = Math.max(secondLargest, largest); 
      largest = rightDigit; 

     } else if(rightDigit > secondLargest) 
      secondLargest = rightDigit; 
    } 
    return new int[]{largest,secondLargest}; 
    } 
0
public int secondMax(int number){ 
    List<Integer> list= new ArrayList<Integer>(); 
    while (number > 0) { 
     list.add(number % 10); 
     number = number/10; 
    } 

    Collections.sort(list); 
    int size= list.size(); 
    return list.get(size - 2); 
} 
0

Пусть MaxValue является самым высоким, и вы можете легко определить, второй по величине

if (times[i] > maxValue) { 
     secondhighest = maxValue; 
     maxValue = times[i]; 
    } else if (times[i] > secondhighest) { 
     secondhighest = times[i]; 
    } 
0
int num = 1395248, n, i, n2; 
for (n2 = i = n = 0; num > 0; i = num % 10, n2 = n < i ? n : n2, n = n < i ? i : n, num /= 10); 
System.out.println(n); 
System.out.println(n2); 
0

Сортировка списка значного числа и получение 1-й и 2-й большие цифры дадут вы в лучшем случае O(n * log n) сложность времени (при условии, что вы будете использовать Quick Sort).
Вы можете добиться более высокой производительности, если будете использовать другой подход: переставьте (переупорядочивайте) свой массив (как в быстрой сортировке), так что у вас будет сводное значение, которое делит ваш массив на две части: те, которые меньше, чем опорные находятся в левой части (левая подматрица), те, которые больше, находятся в правой части (правый подматрица). Проверьте индекс оси:

  • , если он равен размеру массива цифр минус 2, чем это второй по величине элемент (первый самый большой находится рядом с ним, в правом подрешетке);
  • если индекс поворота меньше размера массива цифр минус 2, повторите разделение для правой подматрицы;
  • если индекс поворота больше размера массива цифр минус 2, повторите разбиение на левую подматрицу;

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

Вы можете расширить этот подход, чтобы получить не только 1-й и 2-й по величине разряды, но и k-й (произвольный самый высокий) разряд, а также не только самый большой, но и самый маленький.

Заканчивать кусок кода, который я написал пару дней назад:

public Long selectKthElement(int left, int right, int k, Type type) { 
    int med = partitionIt(left, right); 

    if ((type.equals(Type.Smallest) && med == k - 1) || (type.equals(Type.Largest) && med == nElems - k)) { 
     return theArray[med]; 
    } else if (type.equals(Type.Smallest) && med > k || type.equals(Type.Largest) && med > nElems - k) { 
     return selectKthElement(left, med - 1, k, type); 
    } else if (type.equals(Type.Smallest) && med < k || type.equals(Type.Largest) && med < nElems - k){ 
     return selectKthElement(med + 1, right, k, type); 
    } else { 
     // impossible case, but the source code won't compile w/o the else 
     return null; 
    } 
} 

Здесь theArray массив цифр чисел, partitionIt метод сортирует массив и возвращает индекс медианы, вы можете либо выяснить, как написать его реализацию самостоятельно, либо выполнить поиск в Интернете.

+1

Максимальная длина int составляет 10 цифр. Общее время выполнения * любого * решения не будет далеким от следующего решения. Можно также сосредоточиться на удобочитаемости и ограниченности, а не на эффективности. –

+0

@TimPote Я знаю, это звучит по-детски, но я просто не мог удержаться, чтобы показать, что я знаю немного более эффективное решение. :) – aga

0

U должен делать это.

Держите две целочисленные переменные, высокий и secondHighest сделать ваше время, и ваш первый Условный оператор как код u've показанный добавить еще одно заявление, если-который проверяет кастрированный баран secondhighest больше, чем цифры и погода secondhighest меньше высший

Надеюсь, это поможет.

-1
public static int nthHighest(int[] arr, int n) { 
     List<Integer> lst = Arrays.asList(ArrayUtils.toObject(arr)); //use apache commons library 
     Collections.sort(lst); 
     return lst.get(arr.length-n); 
    } 
0
static void Main(string[] args) 
{ 




    int max = 0, temp = 0, secondMax = 0, number = 0; 

    number = 6541891; 
    while (number != 0) 
    { 
     temp = number % 10; 

     if (max == 0) 
     { 

      max = temp; 
      secondMax = temp; 

     } 
     else if (temp > max) 
     { 
      int lastmax = max; 

      max = temp; 

      if (lastmax > secondMax) 
      { 
       secondMax = lastmax; 
      } 


     } 

     if ((temp > secondMax && temp < max) || secondMax >= max) 
     { 
      secondMax = temp; 
     } 

     number = number/10; 
    } 

    int Result = secondMax; 

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