JavaRush /Java Blog /Random-JA /コーヒーブレイク#110。配列内で 3 番目に大きい数値を見つける方法の問題を解決します。Java で文字列を反転...

コーヒーブレイク#110。配列内で 3 番目に大きい数値を見つける方法の問題を解決します。Java で文字列を反転する

Random-JA グループに公開済み

配列内で 3 番目に大きい数値を見つける方法

出典: Dev.to 解決すべき問題があります。ソート されていない整数の配列が与えられています。配列内で 3 番目に大きい数値を見つけるにはどうすればよいでしょうか? 注: 配列には重複値と負の値の両方が含まれており、配列の長さが N 倍に増加した場合にもこのコードは機能するはずです。 コーヒーブレイク#110。 配列内で 3 番目に大きい数値を見つける方法の問題を解決します。 Java で文字列を反転する - 1解決策は Java で与えられます。

例 1: 負の値を含むソートされていない配列

入力: [87、99、-14、05、46、54] コード:
public class ThirdLargestNumInArray {

    public static void main(String[] args) {

        /*
         * unsorted Array with duplicate and negative values
         */
        Integer arr[] = { 87, 99, -14, 05, 46, 54 };

        /* Variable initialization */
        int largest = 0, secondLargest = 0, thirdLargest = 0;

        /* Condition to find */
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > largest) {
                /*
                 * if condition is true assign large value to second large value
                 */
                secondLargest = largest;

                /* assign new large value */
                largest = arr[i];

            } else if (arr[i] > secondLargest) {
                /*
                 * if condition is true assign second large value to third large value
                 */
                thirdLargest = secondLargest;

                /* assign new second large value */
                secondLargest = arr[i];

            } else if (arr[i] > thirdLargest) {
                /*
                 * if condition is true the third largest value will be assigned
                 */
                thirdLargest = arr[i];
            }
        }

        /* Print the values */
        System.out.println("Largest = " + largest);
        System.out.println("Second Largest = " + secondLargest);
        System.out.println("Third Largest = " + thirdLargest);

    }
}
結論:
最大 = 99 2 番目に大きい = 87 3 番目に大きい = 54
説明:
  1. 前述したように、配列は正と負の両方の値で初期化されます。

  2. 最大値、2 番目に大きい値、3 番目に大きい値をそれぞれ格納するように変数を初期化します。注: 変数は、1 つの特殊な場合に 0 に初期化されます。3 番目の最大要素が配列内にない場合は、0 が返されます。

  3. ループ N (配列の長さ) を何度も繰り返して、3 つの最大値を見つけます。

  4. 条件が、最大値を 2 番目の大きな値に割り当て、配列内の新しい大きな値を初期化することである場合。

    1 番目のelseif条件は、2 番目の大きな値を 3 番目の大きな値に代入し、配列内の新しい 2 番目の大きな値を初期化することです。

    2 番目のelseif条件は、配列内の 3 番目に大きな値を割り当てることです。

  5. 最後に、変数を出力します。

例 2: 負の値と重複した値を含むソートされていない配列

入力: [77、101、95、14、05、46、-47、94、00、95、52、86、36、-54、94、89] コード:
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;

public class ThirdLargestNumInSet {

    public static void main(String[] args) {

        /*
         * unsorted Array with duplicate and negative values
         */
        Integer arr[] = { 77, 101, 14, 05, 46, -47, 94, 00, 95, 52, 86, 36, -54, 94, 89 };

        /* Variable initialization */
        int largest = 0, secondLargest = 0, thirdLargest = 0;

        /*
         * using LinkedHashSet - Map to remove duplication in Array
         */
        Set<Integer> newSet = new LinkedHashSet<>();

        for (int i = 0; i < arr.length; i++) {
            newSet.add(arr[i]);
        }

        /* Condition to find */
        for (Integer i : newSet) {
            if (i > largest) {
                /*
                 * if condition is true assign large value to second large value
                 */
                secondLargest = largest;

                /* assign new large value */
                largest = i;

            } else if (i > secondLargest) {
                /*
                 * if condition is true assign second large value to third large value
                 */
                thirdLargest = secondLargest;

                /* assign new second large value */
                secondLargest = i;

            } else if (i > thirdLargest) {
                /*
                 * if condition is true the third largest value will be assigned
                 */
                thirdLargest = i;
            }
        }

        /* Print the values */
        System.out.print("Largest = " + largest);
        System.out.print("\nSecond Largest = " + secondLargest);
        System.out.print("\nThird Largest = " + thirdLargest);
    }
}
結論:
最大 = 101 2 番目に大きい = 95 3 番目に大きい = 94
説明: 両方のコードで使用されている疑似コードは同じです。例 2 の唯一の違いは、LinkedHashSet を使用していることです。これは、配列内の重複する値を削除する一意のオブジェクトを格納する Java コレクションです。

別の解決策:

バブル ソート アルゴリズム (最低位から最高位へのソート) を使用して配列をソートし、配列の最大値を見つけることができます。入力: [87、99、14、05、46、54] コード:
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;

public class Main {

    public static void bubblesort(Integer[] arr) {

        int n = arr.length;
        int temp;

        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }

            }
        }

    }

    public static void main(String[] args) {

        Integer[] arr = { 87, 99, 14, 05, 46, 54 };

        bubblesort(arr);

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

        int n = arr.length;

        int max = arr[n - 3];
        System.out.println("\n3rd largest value: " + max);
    }

}
結論:
ソート後の配列:5 14 46 54 87 99 3番目に大きい値:54

Java で文字列を反転する

出典: Dev.to

StringBuilder を使用して文字列を反転する Java プログラム

説明: 文字列は、文字の配列によって内部的にサポートされる Java のオブジェクトです。配列は不変 (変更できない) であるため、文字列は不変です。行に変更を加えるたびに、新しい行が作成されます。私たちの場合は、変更可能なStringBuilderを使用しています。注: StringBufferクラスを使用することもできます。コード:
public class ReverseStringBuilder {

    public static void main(String[] args) {

        /* String is immutable */
        String name = "Palindrome";

        /* Create StringBuilder(mutable) object */
        StringBuilder s1 = new StringBuilder();

        /* Using append() and reverse() in StringBuilder */
        s1.append(name);
        s1 = s1.reverse();

        /* Print the reverse */
        System.out.println(s1);

    }

}
結論:
エモードニラP
シーケンス:
  1. Stringクラスのオブジェクトを作成し、初期化します。

  2. 文字列ビルダークラスのオブジェクトを作成します。

  3. 組み込みの文字列ビルダーの append()関数とreverse()関数を使用します。

  4. 文字列ビルダーオブジェクトを出力します。

組み込み関数 String reverse() を使用せずに文字列を反転する Java プログラム

方法 1

説明: toCharArray()関数は、この文字列を文字配列に変換するために使用されます。この後、 forループを使用して各文字を逆順に処理し、各文字の出力を取得します。コード:
public class Reverse {

    public static void main(String[] args) {

        /* String is immutable */
        String name = "Palindrome";

        /* Using toCharArray() function */
        char[] ch = name.toCharArray();

        /* Temp string */
        String rev = "";

        /* Iterating for loop in reverse to store */
        for (int i = ch.length - 1; i >= 0; i--) {
            /* Concatenating Strings */
            rev += ch[i];
        }

        /* Print the reverse */
        System.out.println(rev);

    }

}
結論:
エモードニラP
シーケンス:
  1. Stringクラスのオブジェクトを作成し、初期化します。

  2. 文字配列を作成し、Stringオブジェクトを使用してtoCharArray()関数を呼び出します。

  3. 一時変数のStringオブジェクトを作成します。

  4. forループを逆に繰り返して、各文字を逆の順序で取得します。

  5. 各文字をTemp変数に連結します。

  6. 「温度」と入力します。

方法 2

説明: forループを使用して、文字列を逆の順序で出力しました。一方、charAt(index)メソッドは、指定されたインデックスの文字を返します。各反復後に文字が連結されて文字列変数が変更されます。コード:
public class ReverseCharAt {

    public static void main(String[] args) {

        /* String is immutable */
        String name = "Palindrome";

        /* Temp string */
        String rev = "";

        /* Iterating for loop in reverse to store */
        for (int i = name.length() - 1; i >= 0; i--) {
            /* Concatenating Strings */
            rev = rev + name.charAt(i);
        }

        /* Print the reverse */
        System.out.println(rev);

    }

}
結論:
エモードニラP
シーケンス:
  1. Stringクラスのオブジェクトを作成し、初期化します。

  2. 一時変数のStringオブジェクトを作成します。

  3. forループを逆順に繰り返して、各文字を逆順に取得します。

  4. charAt()関数を呼び出して、各文字をTemp変数に連結します。

  5. Tempを印刷します。

特記事項: reverse 関数についてはよくご存じかもしれませんが、ここでの目的は、StringBuilderの機能と、reverse 関数を使用せずにコードを最適化する方法を調べることです。これが将来誰かの役に立つことを願っています!
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION