如果存在零,如何将数组中的元素向左移1?

时间:2018-03-26 22:33:10

标签: java arrays elements

好的,所以我必须通过一个数组,如果数组中有一个零,那么我必须将零的右边的元素向左移动1.

例如,给定:

[3,0,1,2]

调用方法后我应该得到:

[3,1,2,0]

这是我到目前为止所拥有的;

    public int[] shiftArray(int[] arr)
  { 
      for (int i = 0; i < arr.length - 1; i ++) {
              if (arr[i] == 0) {
                  arr[i] = arr[i+1];
              }
              arr[arr.length - 1] = 0; 
      }
    return null;
  }

我坚持如何将所有左边的元素向左移动1,而不仅仅是零旁边的元素。

4 个答案:

答案 0 :(得分:2)

public int[] shiftArray(int[] arr)
{
    int shift = 0;

    for (int i = 0; i < arr.length; i++) {
        if (arr[i]==0) {
            shift++; // if you only want to handle the 1st zero, use shift = 1
        } else if (shift>0) {
            arr[i-shift] = arr[i];
        }
    }
    for (int i = arr.length - shift; i < arr.length; i++) {
        arr[i] = 0;
    }
    return null;
}

答案 1 :(得分:1)

您的算法/程序应该关注的主要是:

  

如果索引中的值为零且不是最后一个索引,请执行以下两个操作:

     
      
  1. 将索引的值移至右侧
  2.   
  3. 将之前的数字向右移动到左侧。
  4.   

上述步骤非常重要。我发现你在你的问题中忽略了第2步。

以下是我处理它的方式:

    public int[] shiftArray(int[] arr){ 

      for(int i = 0; i < arr.length - 1; i ++) {
              if((arr[i] == 0) && (i != (arr.length - 1))){
                  int prev = arr[i];
                  int next = arr[i + 1];
                  arr[i] = next;
                  arr[i + 1] = prev;
              }
      }
    return arr;
  }

我希望这有帮助..快乐编码!

答案 2 :(得分:1)

以下是两种方法,一种是循环,另一种是流

public static int[] ZeroRight(int[] arr)
{
    int[] temp = new int[arr.length];
    int leftIndex = 0;
    int rightIndex = arr.length-1;
    for (int i : arr) {
        if(i == 0)
        {
            temp[rightIndex] = i;
            rightIndex--;
        } else {
            temp[leftIndex] = i;
            leftIndex++;
        }
    }

    return temp;
}
public static int[] ZeroRightStream(int[] arr)
{
    return Arrays.stream(arr)
                 .boxed()
                 .sorted((a, b) -> {
                       return b == 0? -1: 0; 
                 })
                 .mapToInt(i->i)
                 .toArray();
}

答案 3 :(得分:0)

你可以使用Arrays.stream方法遍历这个数组的元素,filter去掉不需要的元素,重新组合相同长度的数组如下:

int[] arr = {3, 0, 1, 0, 2};

int length = arr.length;

System.out.println(Arrays.toString(arr)); // [3, 0, 1, 0, 2]

arr = Arrays.stream(
        Arrays.stream(arr)
                .filter(i -> i != 0)
                .boxed()
                .toArray(q -> new Integer[length]))
        .mapToInt(i -> i == null ? 0 : i)
        .toArray();

System.out.println(Arrays.toString(arr)); // [3, 1, 2, 0, 0]

这种方法最适合用于对象的数组,而不是原语的数组。
参见:How can you reduce the indices of elements in a string array after deleting an element from it?