1

私は2つの方法で配列を逆にしようとしています:

1)非常に簡単な新しい配列を作成することにより:

public static int[] reverse(int[] array) {
    int[] reverseArray = new int[array.length];
    for(int i = 0; i < reverseArray.length; i++) {
        reverseArray[i] = array[array.length - i - 1];
    }
    return reverseArray;
}

2)2番目の方法は答えを得ましたが、実際にはよくわかりません。実際にはスワッピングを利用し、配列の値を一時変数に渡してから変更して元の変数に返します:

public static int[] reverse2(int[] array)
{
    for (int i=0; i < array.length / 2; i++)
    {   
        int temp = array[i];
        array[i] = array[array.length - i - 1];
        array[array.length - i - 1] = temp;
    }
    return array;
}

誰かが私に2番目のコードを説明してもらえますか? 2で割る意味がわからない?配列のサイズが偶数または奇数の場合はどうなりますか?

4

6 に答える 6

9

2 による除算は、配列の前半だけを処理するためのものです。最初と最後の項目を交換すると、i が array.length に達したときに再度行う必要はありません。サイズが偶数なら後半手前で止まるし、サイズが奇数ならセンター位置の手前で止まるから、どうせ切り替える必要はない。それが役立つことを願っています!

于 2012-11-20T01:43:17.933 に答える
7

あなたの配列がこれであると想像してください:

[ 1 2 3 4 5 ]

投稿した 2 番目のソリューションは次のように機能します。

[ 1 2 3 4 5 ]
  ^--swap-^

[ 5 2 3 4 1 ]
    ^swp^

[ 5 4 3 2 1 ]

ご覧のとおり、配列の半分をトラバースするだけで機能します (したがって、全体をトラバースする必要がある最初のソリューションよりもパフォーマンスが向上します)。これが、2 による除算の出番です。配列の半分は、 までの要素をチェックするだけでよいことに相当しarray.length / 2ます。

要素の数が偶数の場合、同じことを行い、最も内側のペアのみを交換します。

[ 1 2 3 4 5 6 ]
  ^--swap---^

[ 6 2 3 4 5 1 ]
    ^swap-^

[ 6 5 3 4 2 1 ]
      ^-^

[ 6 5 4 3 2 1 ]
于 2012-11-20T01:44:06.000 に答える
2

2 による除算は、配列内のすべての要素をループする必要がないことを意味します。配列を反転しているため、ループが最初の要素にある間は、反対側の最初の要素と交換する必要があることを意味します。

基本的に 2 で割るのは、ループのパス数を減らすためです。パフォーマンスの向上と考えてください。

配列内の要素の数が奇数か偶数かに関係なく、ループは引き続き正常に機能します。要素の数が奇数の場合、ループは中央の要素の前で停止します。

于 2012-11-20T01:45:36.367 に答える
1

位置 0 と n、1 と n-1 などを交換するため、配列は 2 で除算されます。配列に奇数の値が含まれる場合、最後の値は配列の直接中央にある必要があり、そうする必要はありません。交換されます。n/2 スワップのみが発生する必要があるため、配列サイズを n で割った値をループできます。

于 2012-11-20T01:44:18.487 に答える
0

シンプルで素早い...

public class ReverseAnIntegerArray {
static void reverseAnArray(int[] arrNum) {
    System.out.println("Original Array :" + Arrays.toString(arrNum));

    for (int i = arrNum.length - 1; i >= 0; i--) {
        System.out.print(arrNum[i] + " ");
    }

}

public static void main(String[] args) {
    int myArr[] = { 1, 2, -3, 4, 5, 34, 50 };
    reverseAnArray(myArr);
}

}

出力は次のようになります - 元の配列:[1, 2, -3, 4, 5, 34, 50]

50 34 5 4 -3 2 1

于 2018-08-18T18:52:13.530 に答える
-2

2 による除算は完全には機能しません。奇数の整数がある場合にのみ機能します。

例えば:

配列の長さを表す整数を教えてください: 5

5 つの値を入力してください

値 #0: 1

値 #1: 2

値 #2: 3

値 #3: 4

値 #4: 5

現在の配列: 1 | 2 | 3 | 4 | 5 |

配列が逆になりました: 5 | 4 | 3 | 2 | 1 | BUILD SUCCESSFUL (合計時間: 11 秒)

ここで、偶数の整数、たとえば 6 を入力すると、次のようになります。

配列の長さを表す整数を教えてください: 6

6 つの値を入力してください

値 #0: 1

値 #1: 2

値 #2: 3

値 #3: 4

値 #4: 5

値 #5: 6

現在の配列: 1 | 2 | 3 | 4 | 5 | 6 |

配列が逆になりました: 6 | 5 | 3 | 4 | 2 | 1 | BUILD SUCCESSFUL (合計時間: 5 秒)

ソースコード:

/* 配列の長さを表す整数の入力をユーザーに促し、その数の値を入力するようユーザーに求めるプログラムを作成します。これらの値を配列に格納し、配列を出力します。次に、配列要素を逆にして、最初の要素が最後の要素になり、2 番目の要素が最後から 2 番目の要素になり、というように、古い最後の要素が最初になります。印刷される順序を逆にするだけではいけません。実際に配列に格納される方法を変更します。2 番目の配列を作成しないでください。あなたが持っている配列内の要素を再配置するだけです。(ヒント: 場所を変更する必要がある要素を交換します。) 要素が逆になったら、配列を再度出力します。*/

パッケージ reversinganarray;

java.util.Scanner をインポートします。

public class ReversinganArray {

public static void main(String[] args) {
    int i = 0;
    Scanner input = new Scanner(System.in);
    System.out.print("Give me an integer that would represent the length of an array: ");
    int integer = input.nextInt();
    int[] test = new int[integer];
    System.out.println("Enter " + integer + " " + "value(s)");
    while (i < integer) {
        System.out.println("Value #" + i + ": ");
        test[i] = input.nextInt();
        i++;
    }
    System.out.print("Your current array: ");
    i = 0;
    while (i < integer) {
        System.out.print(test[i] + " | ");
        i++;
    }
    i = 0;
    while (i <= integer / 2) {
        int temp = test[i]; //a = b
        test[i] = test[(integer - i - 1)]; //b = c
        test[(integer - i - 1)] = temp;// c = a
        i++;
    }
    System.out.println("");
    System.out.print("Your array reversed: ");
    i = 0;
    while (i <= integer - 1) {
        System.out.print(test[i] + " | ");
        i++;
    }
}

}

私はたまたまこの問題を自分で理解しようとしています...

于 2014-03-01T18:41:43.243 に答える