【问题标题】:Shifting elements of an array to the right将数组的元素向右移动
【发布时间】:2022-01-05 04:17:13
【问题描述】:

我知道有一些解决方案可以移动阵列。但是没有解决方案适合我。代码应实现如下:

shift(int[] array, int places) 方法接收 array,将元素 places 向右移动 次将“剩余”元素替换为“0”。

到目前为止我有:

public static int[] shiftWithDrop(int[] array, int places) {
            
    if (places == 0 || array == null) {
        return null;
    }
    for (int i = array.length-places-1; i >= 0; i-- ) {
        array[i+places] = array[i];
        array[i] = 0;
    }               
    return array;
}

此代码只能以某种方式工作,但不会返回所需的结果。我错过了什么?

【问题讨论】:

  • places为0时,为什么你返回null?这是非常不直观的行为
  • 而且您确实需要展示它没有返回所需结果的情况,另请参阅minimal reproducible example
  • 不要修改输入数组,而是创建一个局部变量并使用它来移动值并返回

标签: java arrays


【解决方案1】:

这段代码有几个问题:

  1. places == 0时返回null -- 不移位,需要返回原始数组
  2. 在给定的循环实现中,可能会跳过数组的主要部分,而不是将第一个 places 元素替换为 0,实际上数组开头的一些元素设置为 0。

另外最好更改方法的签名以在可变参数array.之前设置位置

因此,为了解决这些问题,提供了以下解决方案:

public static int[] shiftWithDrop(int places, int ... array) {
    if(array == null || places <= 0) {
        return array;
    }
    for (int i = array.length; i-- > 0;) {
        array[i] = i  < places ? 0 : array[i - places];
    }
    
    return array;
}    

测试:

System.out.println(Arrays.toString(shiftWithDrop(1, 1, 2, 3, 4, 5)));
System.out.println(Arrays.toString(shiftWithDrop(2, new int[]{1, 2, 3, 4, 5})));
System.out.println(Arrays.toString(shiftWithDrop(3, 1, 2, 3, 4, 5)));
System.out.println(Arrays.toString(shiftWithDrop(7, 1, 2, 3, 4, 5)));

输出:

[0, 1, 2, 3, 4]
[0, 0, 1, 2, 3]
[0, 0, 0, 1, 2]
[0, 0, 0, 0, 0]

【讨论】:

  • 非常感谢!现在我看到了我的代码存在的缺陷。此外,您的循环解决方案效率更高
  • 由于我是 Java 新手,您介意在不使用三元运算符的情况下解释 for 循环吗?
  • 什么意思?循环以反向模式运行(从最后一个元素到第一个元素),in - 1 减少到0,并且三元运算符检查何时应提供 0 而不是由places 移动的值。所以,对于n = 5places = 3arr[4] = arr[1], arr[3] = arr[0]arr[2] 并进一步设置为 0 (2, 1, 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 2019-07-19
  • 2016-02-11
  • 2019-12-26
  • 2020-03-03
  • 1970-01-01
相关资源
最近更新 更多