有人可以解释为什么这不起作用?

时间:2015-01-16 05:22:15

标签: javascript algorithm

我正在通过面试蛋糕算法。这基本上是自我分配的作业。我已经给了它一些,我的解决方案相当丑陋,但我不明白为什么它没有给我正确的输出。算法中只执行一个循环,我尝试切换顺序,以及沿此行的其他版本。

我有点卡在这里,并且有两个与此算法相关的问题,我试图在直接的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]

我的问题:

  1. 为什么这不起作用?我哪里错了?
  2. 使用切片或地图必须有更优雅的方法来做到这一点。我很难过。有人能给我一个提示吗?

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