【问题标题】:How do I shift elements in an array to the left by 1 if there is a zero?如果有零,如何将数组中的元素向左移动 1?
【发布时间】:2018-03-26 22:33:10
【问题描述】:

好的,所以我必须遍历一个数组,如果数组中有一个零,那么我必须将零右边的元素向左移动 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,而不仅仅是零旁边的元素。

【问题讨论】:

    标签: java arrays element


    【解决方案1】:
    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;
    }
    

    【讨论】:

    • 查看您的第二个 for 循环。存在语法错误,您没有为 i 声明类型。
    【解决方案2】:

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

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

    1. 将索引值向右移动
    2. 将之前右边的数字移到左边。

    以上步骤非常重要。我看到您忽略了问题中的第 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;
      }
    

    我希望这会有所帮助.. 编码愉快!

    【讨论】:

      【解决方案3】:

      这里有两种方法,一种是循环,另一种是流

      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) -> b == 0 ? -1 : 0)
                  .mapToInt(i -> i)
                  .toArray();
      }
      

      【讨论】:

        【解决方案4】:

        你可以使用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?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多