【问题标题】:How to shift elements to left after removing array element?删除数组元素后如何将元素向左移动?
【发布时间】:2019-02-18 07:14:29
【问题描述】:

我被要求写,从数组中删除元素(lets say k=30),并在不使用内置方法的情况下将其他元素向左移动。

我尝试了以下方法。

public static void main(String[] args) {
    // TODO Auto-generated method stub

    int[] arr = new int[] { 1, 2, 30, 4, 5, 30, 6 };

    int k = 30;
    int count = 0;

    System.out.println("---Original Array------");
    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i] + " ");
    }

    for (int i = 0; i < arr.length; i++) {

        if (arr[i] == k)
            count++;
    }

    for (int j = 0; j < count; j++) {
        for (int i = 0; i < arr.length; i++) {

            if (arr[i] == k) {
                for (int l = i; l < arr.length - 1; l++) {
                    arr[l] = arr[l + 1];
                }
            }
        }

    }

    System.out.println("---Modified Array------");
    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i] + " ");
    }

}

我需要这样的输出:[1 2 4 5 6 0 0]

但上述逻辑的输出是:[1 2 4 5 6 6 6]

另外,我担心在这里使用嵌套的 for 循环。有什么方法可以在不使用任何内置方法的情况下降低时间复杂度?

【问题讨论】:

  • A break 在某处丢失。 :)

标签: java arrays element


【解决方案1】:

这是另一个变体:

    int[] arr = new int[] { 1, 2, 30, 4, 5, 30, 6 };

    int k = 30;
    int j = 0;

    for (int i = 0; i < arr.length; i++) {
        if (arr[i] != k) {
            arr[j++] = arr[i];
        }
    }
    while (j < arr.length) {
        arr[j++] = 0;
    }

【讨论】:

    【解决方案2】:

    为了不彻底改变您的方法,我建议在末尾添加另一个数组迭代,将0s 插入到数组末尾的count-many 索引。

    这就像添加以下 sn-p 一样简单:

    // nested for loop
    // ...
    
    // set trailing elements to 0s
    for (int i = 0; i < count ; i++) 
        arr[arr.length-1-i] = 0;
    
    System.out.println("\n---Modified Array------");
    // ...
    

    有一些更清洁/更有效的方法可以解决这个问题。 完全根据您的方法,我继续对您的嵌套循环进行了修改,不需要再次迭代。

    for (int j = 0; j < count; j++) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == k) {
                for (int l = i; l < arr.length - 1; l++)
                    arr[l] = arr[l + 1];
                // since we have performed the shifting, we can safely set the last element to 0
                arr[arr.length-1] = 0;   // <----- this was missing!!
            } 
        }
    }
    

    【讨论】:

      【解决方案3】:

      下面的代码给出了想要的结果:

      int [] arr = { 1, 2, 30, 4, 5, 30, 6 };
      int k = 30;
      
      int elementCount = 0;
      
      for (int i = 0; i < arr.length; i++) {
          if (arr[i] == k) {
              ++elementCount;
          }
      }
      
      int count = 0;
      
      for (int i = 0; i < arr.length; i++) {
          if (arr[i] == k) {
              count++;
              for (int j = i; j < arr.length-1; j++) {
                  arr[j] = arr[j+1];
              }
              arr[arr.length-1] = 0;
          }
      
          if (count == elementCount) {
              break;
          }
      }
      

      【讨论】:

        【解决方案4】:

        我不知道它是否有帮助。这是一种简化的方法,更易于阅读和理解(至少对于学习过 C 的人来说),可以根据需要进行删除....

         public static void main(String[] args) {
                int[] arr = new int[] { 1, 2, 30, 4, 5, 30, 6 };
                int k = 30;
                int i=0;
                int j=0;
                for(;j<arr.length;i++,j++){
                    if((arr[i]=arr[j])==k) i--;
                }
                while(i<j)arr[i++]=0;
                System.err.println(Arrays.toString(arr));
           }
        

        输出:[1, 2, 4, 5, 6, 0, 0]

        【讨论】:

          【解决方案5】:

          第一个版本对您的代码进行了小幅修复。你的问题是移位的元素需要被零替换。这基本上需要一个带有arr.length - count

          的if语句
          public static void main(String[] args) {
                  // TODO Auto-generated method stub
          
                  int[] arr = new int[] { 1, 2, 30, 4, 5, 30, 6 };
          
                  int k = 30;
                  int count = 0;
          
                  System.out.println("---Original Array------");
                  for (int i = 0; i < arr.length; i++) {
                      System.out.print(arr[i] + " ");
                  }
                  System.out.println("");
          
                  for (int i = 0; i < arr.length; i++) {
          
                      if (arr[i] == k)
                          count++;
                  }
          
                  for (int j = 0; j < count; j++) {
                      for (int i = 0; i < arr.length; i++) {
                          if(i >= arr.length - count){
                              arr[i] = 0;
                          }else {
                              if (arr[i] == k) {
                                  for (int l = i; l < arr.length - 1; l++) {
                                      arr[l] = arr[l + 1];
                                  }
                              }
                          }
                      }
          
                  }
          
                  System.out.println("---Modified Array------");
                  for (int i = 0; i < arr.length; i++) {
                      System.out.print(arr[i] + " ");
                  }
                  System.out.println("");
          
              }
          

          提供输出

          ---Original Array------
          1 2 30 4 5 30 6 
          ---Modified Array------
          1 2 4 5 6 0 0 
          

          现在,我们也可以简化代码

          public static void main(String[] args) {
                  int[] arr = new int[] { 1, 2, 30, 4, 5, 30, 6 };
                  int k = 30;
                  int count = 0;
          
                  System.out.println("---Original Array------");
                  for (int i = 0; i < arr.length; i++) {
                      System.out.print(arr[i] + " ");
                  }
                  System.out.println("");
          
          
                  for(int i = 0; i < arr.length; i++){
                      if(arr[i]==k){
                          count++;
                      }else{
                          arr[i-count] = arr[i];
                      }
                  }
          
                  for(int i = 1; i <= count; i++){
                      arr[arr.length - i] = 0;
                  }
          
                  System.out.println("---Modified Array------");
                  for (int i = 0; i < arr.length; i++) {
                      System.out.print(arr[i] + " ");
                  }
                  System.out.println("");
              }
          

          输出相同

          【讨论】:

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