1

数値の最上位桁を見つけた後、ループと if ステートメントのみを使用して、同じ数値の 2 番目に高い桁を見つける方法は?

    public static int maximum(int max){

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

8 に答える 8

3

a を使用しListてすべての数字を保存するとsort、必要に応じて最上位、2 番目に上位から最下位の数字にアクセスできます。List用途を並べ替えるにはCollections.sort(List list)

于 2013-11-14T12:18:28.013 に答える
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);
}
于 2013-11-14T12:28:00.790 に答える
0

数値の桁のリストをソートし、1 番目と 2 番目に大きい桁を取得すると、最適なO(n * log n)時間で複雑になります ( Quick Sortを使用すると仮定します)。
別のアプローチを使用すると、パフォーマンスをいくらか向上させることができます。配列を分割 (並べ替え) (クイック ソートのように) すると、配列を 2 つの部分に分割するピボット値が得られます。左側の部分 (左側のサブアレイ)、大きい方は右側の部分 (右側のサブアレイ) にあります。ピボットのインデックスを確認します。

  • 数字の配列のサイズから 2 を引いた値に等しい場合は、2 番目に大きい要素です (1 番目に大きい要素は、右側のサブ配列でその隣にあります)。
  • ピボットのインデックスが数字の配列のサイズから 2 を引いたサイズより小さい場合は、右側のサブ配列に対して分割を繰り返します。
  • ピボットのインデックスが数字の配列のサイズから 2 を引いたサイズよりも大きい場合は、左側のサブ配列の分割を繰り返します。

ある時点で、ピボットは配列の末尾から 2 番目の要素になります。これは、2 番目に大きい要素であり、最大の数が配列の末尾にあることを意味します (ピボットを取得する方法のため)。各パーティションの後、両方ではなく 1 つのサブアレイのみをパーティション化するため、時間の複雑さはクイックソートよりも優れています。

このアプローチを拡張して、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。実装を自分で記述する方法を理解するか、Web を検索することができます。

于 2013-11-14T13:05:29.180 に答える
0

これは、あなたの望むことですか?配列の最初の要素が最大で、2 番目の要素が 2 番目に大きい。そのような要素がない場合は -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};
    }
于 2013-11-14T12:26:36.047 に答える
-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);
    }
于 2015-12-02T10:38:41.613 に答える