0

配列を受け取り、各数値がその回数だけ出力される新しい配列を返す Java でメソッドを作成しようとしています。入力と出力の例を次に示します: "1 2 3 0 4 3" ---> "1 2 2 3 3 3 4 4 4 4 3 3 3"。立ち往生していて、プログラムがコンパイルされません。誰かが私が間違っているところを見ていますか?

public static int [] multiplicity(int [] nums) {
    for (int i = 0 ; i < nums.length ; i++) {
        int size = nums.length + 1;
        int newNums[] = new int [size];
        for (int j = 0 ; j < nums.length ; j++) {
            int value = nums[j];
            for (int v = 0 ; v < value ; v++) {
                newNums[j + v] = value;
            }
        }
    }
    return newNums;
}
4

3 に答える 3

1

現在のコードでは新しい配列のサイズが正しくありません。次のようにコンパイラ エラーを簡単に修正できます。

int size=nums.length+1;
int newNums [] = new int [size];
for (int i=0; i<nums.length; i++)
{
  // int size=nums.length+1;
  // int newNums [] = new int [size];

しかし、それでは明らかにすべての値を設定することはできません。代わりに ( のような動的なデータ型を使用できないと仮定してCollection)、配列を 1 回繰り返して要素の最終的な数を取得し、配列にデータを入力する必要があります。何かのようなもの、

public static int[] multiplicity(int[] nums) {
    // first pass
    int count = 0;
    for (int num : nums) {
        for (int i = 0; i < num; i++) {
            count++;
        }
    }
    int[] ret = new int[count];
    count = 0;
    // second pass
    for (int num : nums) {
        for (int i = 0; i < num; i++) {
            ret[count++] = num;
        }
    }
    return ret;
}

次に、次のようにテストできます。

public static void main(String arg[]) {
    int[] in = { 1, 2, 3, 0, 4, 3 };
    int[] out = multiplicity(in);
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < out.length; i++) {
        if (i != 0) {
            sb.append(' ');
        }
        sb.append(out[i]);
    }
    String expected = "1 2 2 3 3 3 4 4 4 4 3 3 3";
    System.out.println(expected.equals(sb.toString()));
}

出力は

true
于 2014-10-31T02:45:33.023 に答える
0

を初期化するint[] newNumsと、動的にサイズを変更することはできません。再度初期化すると、以前の配列が破棄されます。

問題を解決する別の方法を次に示します。

public static int [] multiplicity (int [ ] nums)
{
    // create a list to contain the output
    List<Integer> newNums = new ArrayList<Integer>();

    // for each incoming int
    if(nums != null) {
        for (final int i : nums)
        {
            // repeat adding the value
            for(int j = 0; j < i; j++) {
                newNums.add(i);
            }
        }
    }

    // now copy from the List<Integer> to the result int[]
    int[] result = new int[newNums.size()];
    for(int i=0; i < newNums.size(); i++) {
        result[i] = newNums.get(i);
    }

    // return the result
    return result;
}
于 2014-10-31T02:44:05.833 に答える