我正在通过面试蛋糕算法。这基本上是自我分配的作业。我已经给了它一些,我的解决方案相当丑陋,但我不明白为什么它没有给我正确的输出。算法中只执行一个循环,我尝试切换顺序,以及沿此行的其他版本。
我有点卡在这里,并且有两个与此算法相关的问题,我试图在直接的Javascript中完成。
问题在于:
您有一个整数数组,并且对于每个索引,您要查找除该索引处的整数之外的每个整数的乘积。编写一个函数get_products_of_all_ints_except_at_index(),它接受一个整数数组并返回一个产品数组。不要使用师。
数组[1,7,3,4]
会回来:
[84,12,28,21]
通过计算:
[7 * 3 * 4,1 * 3 * 4,1 * 7 * 4,1 * 7 * 3]
我的过度尝试如下:
var l = [84, 12, 28, 21],
products_before_curr_index = 1,
products_after_curr_index = 1,
backwards_index=1,
forwards_index,
product_array = [];
for(var factor=0; factor<l.length; factor++){
forwards_index=factor+1;
while(forwards_index<l.length){
products_after_curr_index*=l[forwards_index];
forwards_index+=1;
}
if(factor>0){
products_before_curr_index *= l[factor-backwards_index];
backwards_index+=1;
}
product_array.push(products_after_curr_index*products_before_curr_index);
backwards_index=1;
products_after_curr_index = 1;
products_before_curr_index=1;
}
返回[84,12,28,3]
我的问题:
答案 0 :(得分:3)
这个使用了map对象的map和reduce方法。
function get_products_of_all_ints_except_at_index(inList) {
var product = function (x, y) { return x * y; };
var lists = inList.map(function (v, i, a) {
return a.slice(0, i).concat(a.slice(i + 1, a.length));
});
return lists.map(function (v, i, a) { return v.reduce(product); });
}
// test case
console.log(get_products_of_all_ints_except_at_index([1, 7, 3, 4]));
答案 1 :(得分:2)
是的,看起来你有点过分复杂了。问题描述为您提供了一些如何解决问题的提示。对于数组中的每个整数,您希望找到所有其他整数的乘积。换句话说,您可以循环遍历数组中的每个项目,然后再次遍历数组中的每个项目(也就是嵌套循环)并将除之外的所有产品添加到当前索引中第一个阵列。
例如:
var a = [1, 7, 3, 4];
var b = [];
a.forEach(function( value_1 ) {
var product = 1;
a.forEach(function( value_2 ) {
if ( value_1 != value_2 )
product *= value_2;
});
b.push( product );
});
console.log( b ); // [84, 12, 28, 21]
您的原始解决方案无效,因为您只需返回一次。您使用while循环前进整个数组以计算之后所有元素的乘积,但您只使用一个单独的计算后退:
products_before_curr_index *= l[factor-backwards_index];
因此,您只能在当前索引之前获得该值的乘积。你再也不会回去了。如果你想知道,你恰好得到第三个值(28
),因为第一个数字是1
(也就是说,乘以1
不会有无论如何都做了什么)。尝试将第一个数字更改为不是1
的任何内容,并且您会看到第三个计算也失败。
答案 2 :(得分:1)
我不是特别喜欢Interview Cake提供的解决方案,我觉得这很复杂。我可能没有最优化的解决方案,并且我使用了Numpy(尚不清楚)是否可以做到(但并不能说明我们不能做到,所以...)
它适用于所有测试用例,我觉得它更简单/更容易掌握:
`将numpy导入为np
def get_products_of_all_ints_except_at_index(int_list):
if len(int_list) < 2:
raise IndexError("you need two numbers at least")
products = []
for i in range(len(int_list)):
temp_list = int_list.copy()
del temp_list[i]
prod = np.prod(temp_list)
products.append(prod)
return products