我需要编写一个代码,将元素移到右边的k个位置,元素是索引位置。此外,我应该假设我的数组列表以圆圈形式链接。
示例:
list = [1,2,3,4];
list.shiftRight(1,2);
list = [1,3,4,2]
对于圆圈列表,我想到:
list = [1,2,3,4];
list.shiftRight(2, 3);
list = [1,3,2,4].
这是我的代码,但它无法正常工作。
public void shiftRight(int index, int k) throws ArrayIndexOutOfBoundsException{
if (index < 0 || index > this.list.size())
throw new ArrayIndexOutOfBoundsException();
if (k + index > this.list.size()) {
int element = this.list.remove(index);
this.list.add(this.list.size() - k, element);
} else {
int element = this.list.remove(index);
this.list.add(k + index , element);
}
//System.out.println("ShiftedRight " + this.list);
}
此处还有用于向左移动元素的代码,这些代码也不起作用。 ^ _ ^
public void shiftLeft(int index, int k) throws ArrayIndexOutOfBoundsException {
if (index < 0 || index > this.list.size())
throw new ArrayIndexOutOfBoundsException();
if (k + index > this.list.size()) {
int element = this.list.remove(index);
this.list.add(this.list.size() - k + index, element);
} else {
int element = this.list.remove(index);
this.list.add(index - k, element);
}
//System.out.println("ShiftedLeft " + this.list);
}
答案 0 :(得分:0)
你走在正确的轨道上。有一些边缘条件需要考虑。你必须非常小心索引,长度和一个人。
首先请注意,在4个元素的列表中,有效索引为[0..3]。也就是说,最大索引比长度小一个。
其次,k似乎是无限的。我认为这意味着非负面的。如果是这样,你应该检查一下。它可以比列表的长度大许多倍,即。你可以循环不止一次。所以我们使用模运算。
第三,当您从列表中删除元素时,索引会更改。重新添加元素时需要处理此问题。
public void shiftRight(int index, int k)
throws ArrayIndexOutOfBoundsException
{
int length = this.list.size();
// Note: index cannot be equal to length. You were testing for >.
if ((index < 0) || (index >= length))
{
throw new ArrayIndexOutOfBoundsException('out of range index: ' + index);
}
int shift = k % length; // Use modulo arithmetic to determine a shift in the range [0..length).
if (shift == 0)
{
return; // No change, we're done.
}
int newIndex = (index + shift) % length; // Calculate where to move to, again using modulo arithmetic, to get the loop around.
int element = this.list.remove(index);
this.list.add(newIndex, element);
}
我只是亲自测试了这个,所以请告诉我是否有任何问题。 shiftLeft()
应该类似,但要注意模运算中的负数。