我们如何在数组中交换两个元素?

时间:2013-12-19 23:46:55

标签: java arrays

我想解决的问题如下: -

给定一个整数长度为3的数组,返回一个元素“向左旋转”的数组,以便{1,2,3}产生{2,3,1}

我想出了以下代码: -

public int[] rotateLeft3(int[] nums) {
  for(int i=0;i<2;i++)
   swap(nums[i],nums[i+1]);
  return nums;
}

public void swap(int a,int b)
{
 int temp = a;
 a = b;
 b= temp;
}

但是,它没有成功运行。在C ++的情况下,我可以将引用作为参数传递,问题将被排序,然后为什么不在这里发生?

以下代码正在运行: -

public int[] rotateLeft3(int[] nums) {
  int temp = nums[0];
  nums[0] = nums[1];
  nums[1] = temp;
  temp = nums[1];
  nums[1] = nums[2];
  nums[2] = temp;
  return nums;
}

但是这段代码是完整的蛮力写作,我不是很喜欢它。您能否建议我如何使第一种方法有效?

6 个答案:

答案 0 :(得分:6)

java方法调用中的所有参数都按值传递。您需要传入数组和要交换的两个索引。

public void swap(int[] array, int a,int b)
{
 int temp = array[a];
 array[a] = array[b];
 array[b]= temp;
}

答案 1 :(得分:4)

正如你所说,问题是通过引用传递,C做到了 - Java没有。尽管如此,还有很多其他方法可以达到同样的目的。

最简单的方法是将数组和两个索引传递给swap函数,而不是传递给该索引的数组内容。

答案 2 :(得分:3)

如果您想要不受尺寸限制的旋转,请尝试:

public int[] rotateLeft(int[] nums){
  if(nums.length == 0)
    return new int[0];

  int temp = nums[0];
  //This loop starts at index 1 because we are moving
  //    elements left, and 0 can't move left.
  for(int index = 1; index < nums.length; index++){
    nums[index-1] = nums[index];
  }

  nums[nums.length-1] = temp;
}

答案 3 :(得分:3)

你也可以使用没有temp变量的xor交换;)

public void swap(int[] array, int ind1, int ind2) {
 array[ind1] ^= array[ind2]
 array[ind1] ^= (array[ind2] ^= array[ind1])
}

答案 4 :(得分:2)

调用swap方法时,您将传递数组中的值,但该方法不返回a和b值。是的,可以使用指针在C / C ++中完成,但java没有它。

Xynariz的代码提供了一种不仅限于数组大小的转换方式。

答案 5 :(得分:0)

您可以使用单行使用模式创建交换功能,但调用格式不典型:

public int[] rotateLeft3(int[] nums) {
  for(int i=0;i<2;i++)
    nums[i+1] = swap(nums[i], nums[i]=nums[i+1]);
  return nums;
}

// swaps any number of same type objects
public <T> T swap(T... args) {
  // usage: z = swap(a, a=b, b=c, ... y=z);
  return args[0];
}

这是有效的,因为第一个参数在其余参数中发生赋值之前被传递到swap中。