Java 计算给定整数元素数组中*{0,…,r}范围内整数的出现次数

Java 计算给定整数元素数组中*{0,…,r}范围内整数的出现次数,java,algorithm,Java,Algorithm,由于某种原因,我的解决方案并不完整。我从隐藏的规格测试中得到了83/100 我的解决方案有什么问题?可能有一个我没有想到的用例 其他信息: 实现一个方法count,该方法给定一个整数元素数组,返回另一个数组,该数组包含输入数组中每个整数{0,…,r}的出现次数,其中r是一个整数,用于显示需要计数的整数的上边界 返回的计数数组大小为r+1,其中每个索引i处的元素对应于整数i的出现次数(i在{0,…,r}) 可以忽略输入数组中0到r整数范围之外的元素 例如,如果输入[0,8,1,3,1,3,10,3

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

我的解决方案有什么问题?可能有一个我没有想到的用例

其他信息:

实现一个方法count,该方法给定一个整数元素数组,返回另一个数组,该数组包含输入数组中每个整数{0,…,r}的出现次数,其中r是一个整数,用于显示需要计数的整数的上边界

返回的计数数组大小为r+1,其中每个索引i处的元素对应于整数i的出现次数(i在{0,…,r})

可以忽略输入数组中0到r整数范围之外的元素

例如,如果输入[0,8,1,3,1,3,10,3]的r为4,则输出应为[1,2,0,3,0]

如果输入数组为null或长度为0,则返回null

空间要求:方法count应该只为count数组使用额外的空间

时间要求:计数应在通过输入阵列的一次过程中计算

公共类计数重复{
/**
*计算范围内整数的出现次数
*给定整数元素数组中的{0,…,r}。返回
*计数数组:大小为r+1的新整数数组,其中
*索引i处的元素表示相等元素的出现次数
*到给定输入数组中的i(i位于{0,…,r})。
*如果输入数组为null或长度为0,则返回null。
*
*@param arr要计数的整数元素数组。
*@param r表示范围最后一个元素的整数。
*@返回一个新数组,其中包含每个
*输入数组中的整数{0,…,r}(索引i具有
*输入数组中等于i的元素计数,带i
*在{0,…,r})中
*/
公共静态int[]计数(int[]arr,int r){
//例外情况
//1.如果输入数组为null或长度为0,则返回null。
if(arr==null | | arr.length==0)返回null;
//正常情况
int[]结果=新的int[r+1];
对于(int x:arr)如果(x>=0&&x
如果(x>=0&&x=0。

正如@kaya3所指出的那样


问题是r包含在范围内,因此xx可能r的值大于您可以分配的值。使用稀疏存储可能更好?问题是r包含在范围内,因此
x
应该是
x@kaya3,这确实是问题所在。非常感谢。检查
r>=0
是重新绑定的ant,因为如果其他两个条件为真,则传递性意味着它。因为这是代码的唯一问题,所以这个问题不属于主题,因为它是由打字错误引起的。例如,如果将r=-2传递给方法,它将尝试分配新的int[-1],但失败,问题说“返回的计数数组的大小将为r+1”因此,如果r=-2是一个可能的输入,那么问题本身就是错误的,因为它指定在这种情况下方法应该返回长度为-1的数组。好吧,我只是偏执:)如果(r<0)抛出新的IllegalArgumentException(“r为负”);看起来在线法官没有那么挑剔;基于基本相同的问题,你甚至不需要检查
x>=0
就可以通过测试案例。
public class CountRepetitions {

    /**
     * Calculates the number of occurrences of integers from the range
     * {0, ..., r} within a given array of integer elements. Returns
     * the array of counts: a new array of integers of size r + 1, where the
     * element at index i denotes the number occurrences of elements equal
     * to i in the given input array (with i in {0, ..., r}).
     * If the input array is null or of length 0, this will return null.
     *
     * @param arr the array of integer elements to be counted.
     * @param r   the integer indicating the last element of the range.
     * @return a new array containing the number of occurrences of each
     * integer {0, ..., r} in the input array (index i has the
     * count of elements equal to i in the input array, with i
     * in {0, ..., r})
     */
    public static int[] count(int[] arr, int r) {
        // Exceptional cases
        // 1. If the input array is null or of length 0, this will return null.
        if (arr == null || arr.length == 0) return null;

        // Normal case
        int[] result = new int[r + 1];
        for (int x : arr) if (x >= 0 && x < r) result[x]++;
        return result;
    }