递归地过滤奇数

时间:2016-12-01 18:35:42

标签: java arrays recursion filter

您如何解决以下任务: 写一个递归方法,它传递一个数组,过滤所有奇数并将它们存储到一个数组中。返回的数组必须按每个元素顺序排序。 您不允许使用任何提供的方法,如Arrays.sort,Lists等Java类。此外,不允许循环,并且通用的已知排序算法也适用于结果。

过滤的部分很简单,但我不知道如何将每个元素放在正确的位置。目前,我的方法只返回一个包含所有奇数的未排序数组。

public static int[] filterOdd(int[] m){
    return filterOdd(m, 0, 0);
}

private static int[] filterOdd(int[] m, int idx, int idxToPlace){
    if(idx <= m.length -1){
        if(m[idx] % 2 == 0){
            return filterOdd(m, idx + 1, idxToPlace);
        }else{
            int[] buffer = filterOdd(m, idx + 1, idxToPlace + 1);
            buffer[idxToPlace] = m[idx];
            return buffer;
        }
    }else{
        return new int[numberOfOddIntegers(m)];
    }
}

有没有办法递归地在正确的位置插入奇数?

2 个答案:

答案 0 :(得分:0)

在您执行buffer[idxToPlace] = m[idx];的地方,您必须调用另一个方法,该方法将返回已添加当前处理编号的已排序数组。

这个新方法也可以递归:你知道那时你手中的数组是有序的。您只是递归遍历(例如从结尾到开始),从您的元素适合的那一刻起(例如,小于前一个元素),您可以插入它并返回已排序的数组。如果只有一个元素(基本情况),你可以返回它。

这样,在算法结束时,列表将被排序。

答案 1 :(得分:0)

  

我不允许使用System.arraycopy

这意味着您需要弄清楚您将拥有多少个奇数,以便正确调整结果大小:

public static int[] filterOdd(int[] m){
    int[] res = new int[countOdd(m, 0)];
    filterOdd(m, 0, 0, res);
    return res;
}

private static int countOdd(int[] m, int i) {
    if (i == m.length) {
        return 0;
    }
    int isOdd = m[i] % 2 != 0 ? 1 : 0;
    return isOdd + countOdd(m, i+1);
}

private static void filterOdd(int[] m, int src, int dest, int[] res){
    if(src == m.length) {
        return;
    }
    if (m[src] % 2 != 0) {
        res[dest++] = m[src];
    }
    filterOdd(m, src+1, dest, res);
}