我想解决的问题如下: -
给定一个整数长度为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;
}
但是这段代码是完整的蛮力写作,我不是很喜欢它。您能否建议我如何使第一种方法有效?
答案 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中。