【问题标题】:To remove 3 consecutive numbers in an array删除数组中的 3 个连续数字
【发布时间】:2021-02-22 05:46:38
【问题描述】:

我需要删除 3 个连续整数,用代码完成,但我无法打印最后一个索引号。你能帮帮我吗..

这里是代码..

public class MyClass {
    public static void main(String args[]) {
    int[] list={ 1, 1, 1, 2, 3, 4, 5, 5, 6, 5, 7, 8, 9};
    for(int i=0; i<list.length;i++)
    {
        if((list[i]==list[i+1]) )
        {
            if(list[i]==list[i+2])
            {
                i=i+2;
                continue;
            }
           System.out.print(list[i]) ;
        }
        else 
        {
            System.out.print(list[i]);
        }
    }
    }  
}

【问题讨论】:

  • “但我无法打印最后一个索引”查看 for 循环中的条件,“i&lt;list.length-1”。
  • 您还应该在数组初始化程序中将 8 更改为 9,看看效果如何。
  • 现在我得到了 arrayOutOfBound 异常

标签: java arrays algorithm for-loop


【解决方案1】:

我认为这是i&lt;list.length-1 子句。你的 lis.length 将返回 13 的值,如果我记得如何计数,加上 -1,你给出的值是 12,如果你加上 i 只能达到11 位。

所以我认为解决方案可能是以下之一:

for(int i=0; i&lt;=list.length-1;i++)

for(int i=0; i&lt;list.length;i++)

【讨论】:

  • 更改后我得到 ArrayOutOfBound Exception..
【解决方案2】:

正如@Dr.Will 在他/她的answer 中所述,您的代码中的问题之一是检查i &lt; list.length。 无论如何,它不是唯一一个:您在访问 [i+1][i+2] 元素时没有检查这两个值是否是可接受的索引。

我只是想添加一些提示:

  1. 在编写此类算法时使用调试器(它可以为您节省大量时间)
  2. 缓存中间结果的值,避免多次访问同一数组元素
  3. 缓存数组的大小,出于同样的原因,或者使用反向循环(其中有一些advantages

结果如下所示:

public class MyClass {
    public static void main(String... args) {
        int[] list = { 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 5, 7, 8, 9}; // sample list
        int len = list.length;
        if(len < 3)
          return;  // avoid ArrayIndexOutOfBoundsException
        
        // forward loop
        System.out.println("Forward loop:");
        int elem1;
        for(int i = 0; i < len; i++){
          elem1 = list[i];
          if(i+1 < len && elem1 != list[i+1])
            System.out.println(elem1);
          else if (i+2 < len && elem1 == list[i+2] && ++i < len){
            // note that "&&" in java is a shot-circuit "AND", so the last "++i" will not be executed if not necessary
            // also note that i'm not incrementing "+2", because the for loop will add another "+1" just after this "continue" statement
            continue;
          } else
            System.out.println(elem1);
        }
        
        // reverse loop
        System.out.println("\nReverse loop (if the order is not that relevant):");
        for(int i = len; --i >= 0;){
            elem1 = list[i];
            if(i-1 >= 0 && elem1 != list[i-1])
                System.out.println(elem1);
            else if(i-2 >= 0 && elem1 == list[i-2] && --i >= 0)
                continue;
            else
                System.out.println(elem1);
        }
    }
}

【讨论】:

  • 谢谢你的逻辑,你的逻辑很好,看起来也有点复杂,但是我在参考你的逻辑后更改或编辑了一行,这似乎没有你的逻辑复杂,但给出了相同的结果。
【解决方案3】:

感谢您的逻辑(–Marco Carlo Moriggi),您的逻辑很有帮助,而且看起来也有点复杂,但我在参考您的逻辑后更改或编辑了一行,这似乎不像您的逻辑那么复杂,但给出了相同的结果。

public class MyClass {
    public static void main(String args[]) {
    int[] list={ 1, 1, 1, 2, 3, 4, 5, 5, 6, 5, 7, 8, 9};
    int elem = list.length;
    for(int i=0; i<list.length;i++)
    {
        if((i+2<elem) && (list[i]==list[i+1]) )
        {
            System.out.print(list[i] + "  ") ;
            if(list[i]==list[i+2])
            {
                i=i+2;
                continue;
            }
           
        }
        else 
        {
            System.out.print(list[i] + "  ");
        }
    }
    }  
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-26
    • 2023-03-03
    • 2017-02-11
    • 2016-09-02
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多