配列内で 3 番目に大きい数値を見つける方法
出典: Dev.to 解決すべき問題があります。ソート されていない整数の配列が与えられています。配列内で 3 番目に大きい数値を見つけるにはどうすればよいでしょうか? 注: 配列には重複値と負の値の両方が含まれており、配列の長さが N 倍に増加した場合にもこのコードは機能するはずです。 解決策は 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
説明:
-
前述したように、配列は正と負の両方の値で初期化されます。
-
最大値、2 番目に大きい値、3 番目に大きい値をそれぞれ格納するように変数を初期化します。注: 変数は、1 つの特殊な場合に 0 に初期化されます。3 番目の最大要素が配列内にない場合は、0 が返されます。
-
ループ N (配列の長さ) を何度も繰り返して、3 つの最大値を見つけます。
-
条件が、最大値を 2 番目の大きな値に割り当て、配列内の新しい大きな値を初期化することである場合。
1 番目のelseif条件は、2 番目の大きな値を 3 番目の大きな値に代入し、配列内の新しい 2 番目の大きな値を初期化することです。
2 番目のelseif条件は、配列内の 3 番目に大きな値を割り当てることです。
-
最後に、変数を出力します。
例 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.toStringBuilder を使用して文字列を反転する 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
シーケンス:
-
Stringクラスのオブジェクトを作成し、初期化します。
-
文字列ビルダークラスのオブジェクトを作成します。
-
組み込みの文字列ビルダーの append()関数とreverse()関数を使用します。
-
文字列ビルダーオブジェクトを出力します。
組み込み関数 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
シーケンス:
-
Stringクラスのオブジェクトを作成し、初期化します。
-
文字配列を作成し、Stringオブジェクトを使用してtoCharArray()関数を呼び出します。
-
一時変数のStringオブジェクトを作成します。
-
forループを逆に繰り返して、各文字を逆の順序で取得します。
-
各文字をTemp変数に連結します。
-
「温度」と入力します。
方法 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
シーケンス:
-
Stringクラスのオブジェクトを作成し、初期化します。
-
一時変数のStringオブジェクトを作成します。
-
forループを逆順に繰り返して、各文字を逆順に取得します。
-
charAt()関数を呼び出して、各文字をTemp変数に連結します。
-
Tempを印刷します。
GO TO FULL VERSION