【发布时间】: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 有一点:您的问题与任务本身无关,而与您处理数组的方式有关。