Java 从数组中删除特定整数的最后一个匹配项

Java 从数组中删除特定整数的最后一个匹配项,java,algorithm,Java,Algorithm,由于某种原因,我的解决方案并不完整。我从隐藏的规格测试中得到了80/100 我的解决方案有什么问题?可能有一个我没有想到的用例。 使用ArrayList而不是array会如何改变空间/时间复杂性 有没有更好的办法来解决这个问题 我当前的解决方案处理: 空的输入数组 输入数组中的负/正整数值 输入数组中的重复项 已排序/未排序的输入数组 说明: 编写一个Java方法removeLastOccurrence(int x,int[]arr),它从给定的整数元素数组arr中删除给定整数元素x的最后

由于某种原因,我的解决方案并不完整。我从隐藏的规格测试中得到了80/100

  • 我的解决方案有什么问题?可能有一个我没有想到的用例。
  • 使用ArrayList而不是array会如何改变空间/时间复杂性
  • 有没有更好的办法来解决这个问题
  • 我当前的解决方案处理:

    • 空的输入数组
    • 输入数组中的负/正整数值
    • 输入数组中的重复项
    • 已排序/未排序的输入数组

    说明: 编写一个Java方法removeLastOccurrence(int x,int[]arr),它从给定的整数元素数组arr中删除给定整数元素x的最后一个匹配项

    该方法应返回一个新数组,该数组包含给定数组arr中的所有元素,元素x的最后一次出现除外。其余元素应以相同的顺序出现在输入数组和返回数组中

    右边的代码显示了一个代码框架,其中仍然缺少一个静态方法的实现。提供此实现,并通过自己编写更多测试或使用提供的测试和规范测试来检查它是否正确

    我的代码:
    为什么不尝试反向迭代呢

    for(int i = arr.length; i => 0; i--)
    { 
       if (arr[i] == x)
       {
           return ArrayUtils.remove(arr, i)
        }
    }
    

    然后,在找到索引后,您可以使用apachecommons ArrayUtils命令删除位于

    的项。这是答案,非常感谢

    此外,如果找不到x,您的x将崩溃。。。我的没有。也许那就是20分的去向?

    我已经在检查这一点,但在我的代码中为时已晚。所以我不得不搬家

    if(last_index==-1)返回arr在while循环之前,我得到了100/100的分数


    你的教授喜欢这个吗?换一种方式,我认为没有比你的答案更有效的了。但也许他们喜欢看到使用的java类

    你的教授没有告诉你你在哪里失分吗?如果他们不告诉你他们对满分的期望值,你就无法提高。但这是另一种方式。。。再说一次,在我看来没有更好,也不值得再加二十分。我会把它贴出来,因为这是另一种方式

        public int[] removeLastOccurrence2(int x, int[] arr) {
    
            // if arr == null return null;
            if (arr == null || arr.length == 0) return arr;
    
            // Fill an ArrayList with your initial array ...
    
            java.util.List list = new java.util.ArrayList(arr.length);
    
            for (int i=0; i<arr.length; i++) {
                list.add(arr[i]);
            }
    
            int[] res;
    
            // Now ... use ArrayList methods to do the work.
    
            // Also, if there is no x to find, yours crashes ... mine doesn't.
            // Maybe that's where the twenty marks went?
    
            if ( list.lastIndexOf(x) != -1 ) { // This screens for no x found at all ...
    
                 list.remove( list.lastIndexOf(x) ); // Done!
    
                 // Make a new array to return.
                 res = new int[list.size()];
                 for (int i=0; i<list.size(); i++) {
                     res[i] = (int) list.get(i);
                 }
    
            } else {
    
                // No 'x' found, so just return the original array.
                res = arr;
            }        
    
           return res;
        }
    
    public int[]removeLastOccurrence2(int x,int[]arr){
    //如果arr==null,则返回null;
    如果(arr==null | | arr.length==0)返回arr;
    //用初始数组填充ArrayList。。。
    java.util.List List=new java.util.ArrayList(arr.length);
    
    对于(int i=0;我想到了这个极端情况:
    [1,4,7,9]
    和目标
    x=9
    。你的代码将是一个死循环,因为
    i
    永远不会自行增加。@ZhaoGang感谢你的评论,但是,你说的是不正确的。
    i
    在两种情况下增加。
    if(i++
    else res res[j++]=arr[i++];
    并且上面的例子处理正确,在发布问题之前已经用Java单元测试进行了测试。但是在您发布的代码中,if子句和else子句不匹配。else子句与
    if(i==last_index)匹配{
    @gforghierithanks感谢您的回答,但练习的重点是“该方法应返回一个新数组,该数组包含给定数组arr中的所有元素,元素x的最后一次出现除外”以数组和最后出现的元素x为例,将其余元素移到左边。通常,我必须在一个孤立的在线环境中解决这个问题,在这个环境中,我无法访问本机Java UTIL以外的依赖项。感谢您的回答,我必须在一个没有任何feedba的孤立web环境中提供一个解决方案除了0/100的分数,你的解决方案得到了100/100,所以有一个案例不是我的解决方案处理的。你能想到一个输入值为x和arr的测试案例吗?在这个案例中,我的代码会失败,而你的代码会通过?
    for(int i = arr.length; i => 0; i--)
    { 
       if (arr[i] == x)
       {
           return ArrayUtils.remove(arr, i)
        }
    }
    
        public int[] removeLastOccurrence2(int x, int[] arr) {
    
            // if arr == null return null;
            if (arr == null || arr.length == 0) return arr;
    
            // Fill an ArrayList with your initial array ...
    
            java.util.List list = new java.util.ArrayList(arr.length);
    
            for (int i=0; i<arr.length; i++) {
                list.add(arr[i]);
            }
    
            int[] res;
    
            // Now ... use ArrayList methods to do the work.
    
            // Also, if there is no x to find, yours crashes ... mine doesn't.
            // Maybe that's where the twenty marks went?
    
            if ( list.lastIndexOf(x) != -1 ) { // This screens for no x found at all ...
    
                 list.remove( list.lastIndexOf(x) ); // Done!
    
                 // Make a new array to return.
                 res = new int[list.size()];
                 for (int i=0; i<list.size(); i++) {
                     res[i] = (int) list.get(i);
                 }
    
            } else {
    
                // No 'x' found, so just return the original array.
                res = arr;
            }        
    
           return res;
        }