0

配列サイズが 3 で、最初のインデックスを最後の場所にシフトし、他のインデックスを左にシフトしようとしています。例えば:

{1,2,3} から {2,3,1}

ここに私のコードがあります

 int[] nums = {1,2,3}; 
 int[] numsShifted = new int[3];

 for(int i = 0; i < nums.length - 1; i++)
 {
  int tempNum = nums[i];
  numsRotated[i] = nums[i + 1];
  numsRotated[i+1] = tempNum;
 }

私が抱えている問題は、配列の最後のインデックスです。間違った値を取得します。ありがとう。

4

7 に答える 7

2

単純なシフトを実行してから、最後の位置の最初の番号をコピーします。

 int[] nums = {1,2,3}; 
 int[] numsShifted = new int[3];

 int temp = nums[0];
 for(int i = 1; i < nums.length; i++)
 {
    numsShifted[i - 1] = nums[i];
 }
 numsShifted[nums.length - 1] = temp;

編集:元の配列を上書きしていないため、最初のアイテムを実際に保護する必要はありません。

于 2012-04-06T17:56:36.740 に答える
0
int[] nums = {1,2,3}; 
int[] numsShifted = new int[3];

    for(int i = 0; i < nums.length - 1; i++)
    {
        int tempNum = nums[i]; //tempNum=1, tempNum=2
        numsRotated[i] = nums[i + 1]; //numsRotated[0]=2, numsRotated[1]=3
        numsRotated[i+1] = tempNum; //numsRotated[1]=1, numsRotated[2]=2  <- this is incorrect and the loop ends
    }

最後に、2、3、2があります。ループを修正する必要があります。

于 2012-04-06T18:01:01.443 に答える
0

さて、ループの外側に最初の要素を格納してから、シフトを開始する必要があります。ループの終了後、配列の最後の要素として格納されている最初の要素を配置するだけです。

于 2012-04-06T17:57:38.160 に答える
0

nums[0]の値を保存する必要があります。

int saved = nums[0];

for(int i = 0; i < nums.length - 1; i++) {
  numsShifted[i] = nums[i+1];
}
numsShifted[numsShifted.length - 1] = saved;
于 2012-04-06T17:57:40.500 に答える
0

あなたが書いたコードを使用したい場合は、私のように修正してください。そうでなければ、他の答えはかなり良いです!

    int[] nums = {1, 2, 3};
    int[] numsShifted = new int[3];

    for (int i = 0; i < nums.length; i++) { //Do one more iteration
        if (i + 1 > 2) { //If this is the last element, we take the first one of nums
            numsShifted[i] = nums[0];
        } else { //Otherwise we do as you did in your code
            numsShifted[i] = nums[i + 1];
            numsShifted[i + 1] = nums[i];
        }            
    }
    System.out.println(Arrays.toString(numsShifted));

編集:不要なため、tempNumを削除します

于 2012-04-06T18:03:59.573 に答える
0
int[] a = {1,2,3};
int[] b = new int[3];

for(int j = 0 , i = 2 ; j < a.length ; j++)
{
     b[i++] = a[j];
     if(i >= 3)
     i = 0;
}
于 2012-04-06T18:05:21.120 に答える
0

ループなしのその他のオプションを次に示します。

public static int[] queueFirst(int[] in) {
   int len = in.length;   
   if (len <= 1) return in;
   int[] ret  = Arrays.copyOf(Arrays.copyOfRange(in, 1, len), len);
   ret[len - 1] = in[0];
   return ret;
}

または参考のために:

public static <T> T[] queueFirst(T[] in) {
   if (in.length <= 1) return in;
   ArrayList<T> n = new ArrayList<T>(Arrays.asList(in));
   n.add(n.remove(0));
   return n.toArray(in);
}
于 2012-04-06T18:26:16.523 に答える