【问题标题】:how to filter an array using a binary representation of an integer argument?如何使用整数参数的二进制表示过滤数组?
【发布时间】:2020-01-30 12:24:40
【问题描述】:

> > 数字的二进制表示可用于从数组中选择元素。例如,

                 n: 88 = 23 + 24 + 26 (1011000)
                 array: 8, 4, 9, 0, 3, 1, 2
               indexes: 0  1  2  3  4  5  6
                 selected        *  *     *
                   result        0, 3,    2 so the result of filtering {8, 4, 9, 0, 3, 1, 2} using 88 would be {0, 3, 2} In the

上面,被选中的元素是那些使用了索引的元素 作为 88 的二进制表示中的指数。换句话说,a[3], 选择 a[4] 和 a[6] 作为结果,因为 3、4 和 6 是 2 的幂,总和为 88。编写一个名为 filterArray 的方法 接受一个数组和一个非负整数并返回结果 使用整数的二进制表示过滤数组。 返回的数组必须足够大以包含过滤后的元素 没有更大的。所以在上面的例子中,返回的数组有长度 3,而不是 7(这是原始数组的大小。)此外,如果 输入数组不够大,无法包含所有选定的 元素,则该方法返回 null。例如,如果 n=3 用于 过滤数组 a = {18},该方法应返回 null,因为 3=20+21 因此要求数组至少有 2 个元素 a[0] 和 a1,但没有 a1。如果您使用的是 Java 或 C#,则 函数的签名是 int[ ] filterArray(int[ ] a, int n)

我想解决这个问题,我写了这段代码

public static int[] filterArray(int[] a, int n) {
    int[] x = new int[a.length];
    int j = 0;
    int count = 0;
    while (n > 0) {
        int digit = n % 2;
        n /= 2;
        x[j] = digit;
        j++;
    }

    System.out.println(Arrays.toString(a));

    System.out.println(Arrays.toString(x));

    for (int k = 0; k < x.length; k++) {
        if (x[k] == 1)
            count++;
    }

    System.out.println("count is " + count);

    int[] z = new int[count];
    for (int i = 0; i < z.length; i++) {
        for (int k = 0; k < x.length; k++) {
            if(x[k] == 1) {
                z[i] = a[k];
            }
        }
    }

    System.out.println(Arrays.toString(z));
    return x;

}

当我尝试使用测试数组进行测试时

System.out.println(Arrays.toString(filterArray(new int[] { 0, 9, 12, 18, -6 }, 11)));

它给了我以下输出

[18, 18, 18]

正确的输出是

[0, 9, 18]

【问题讨论】:

  • 请重新格式化引用的问题。在目前的状态下,阅读起来很痛苦。作为一个例子,我怀疑不是88 = 23 + 24 + 26(这会令人困惑)你的意思是88 = 2^3 + 2^4 + 2^6(你甚至可以使用在cmets中不起作用的超级脚本html标签:))。
  • 更清晰的解释会有很大帮助
  • 看来88(1011000)的二进制表示在这里起不到任何作用。你确定吗?如果是这样,最好将其从问题中删除以避免更多混乱
  • 这个想法是来自 88 的二进制表示的那些应该与给定数组中的模式匹配,并且带有 1 的索引应该在另一个大小为 3 的数组中返回。 e 0, 3, 2
  • Victor 有一点:您的问题与任务本身无关,而与您处理数组的方式有关。

标签: java arrays


【解决方案1】:

问题在于您的嵌套循环:您正在为输出数组的 each 元素迭代整个输入数组,并继续用最后找到的元素覆盖值(使用调试器,你会看到)。

要解决这个问题,请交换循环并跟踪“下一个”输出索引:

  int i = 0;
  for (int k = 0; k < x.length; k++) {
    if(x[k] == 1) {
        z[i] = a[k];
        i++; //advance the output index
    }
  }

这也将使您的代码更快,因为现在您没有 O(n2) 复杂度,而只有 O(n)。

【讨论】:

    猜你喜欢
    • 2014-12-29
    • 2015-01-21
    • 2014-09-19
    • 1970-01-01
    • 2019-02-04
    • 2018-03-17
    • 2019-09-24
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多