我在编码挑战中遇到了这个问题而无法解决它。这是问题陈述:
给定一系列交易成本t,返回一个预期成本数组e,如果e [i]中除t之外的所有交易成本的乘积均为0,则返回0,否则为1(即t中的任何元素) [i],找到除t [i]之外的所有t元素的乘积。如果该乘积是偶数,则t [i]的结果为0,否则为1)。
例如t = [1,2,3,4],e = [0,0,0,0]
说明:对于t,所有产品均为:[24,12,8,6]
约束:在O(n)中进行,不进行除法。
仅供参考,我是在O(N ^ 2)中完成的,但在O(N)
中无法解决我的解决方案:
int[] arr = {1, 2, 3, 4};
int[] res = new int[arr.length];
for(int i = 0; i < arr.length; i++){
int prd = 1;
for(int j = 0; j < arr.length; j++){
if(i == j) {
continue;
}
prd *= arr[j];
}
if((prd & 1) == 0){
res[i] = 0;
}else {
res[i] = 1;
}
}
答案 0 :(得分:0)
你不需要分裂;你需要的只是一个简单的奇数/偶数检查。无论你如何做到这一点都很好;例如,除了最后一点之外,屏蔽掉所有东西。
很简单,如果所有元素都是奇数,则e
是1的向量。如果一个元素是偶数,e
是所有0的向量,除了那个位置,即1。如果多个元素是偶数,则e
是0的向量。
这需要单次通过t
( O(N))来查找偶数元素的数量;然后,您可以在 O(N)时间
e