编写一个接受正整数n作为输入的算法,执行该算法时,将打印出所有长度为n的自知数组的列表

时间:2018-11-14 21:59:28

标签: arrays algorithm

自觉阵列。

  

如果每个i

例如,[2, 0, 2, 0]具有自我意识。

编写一种算法,接受一个正整数n作为输入,执行该算法时,将打印出具有该长度的所有自知数组的列表。

这里找到了一些自我感知的阵列。但是我还没有找到算法。

N = 4
{2, 0, 2, 0}
{1, 2, 1, 0}

N = 5
{2, 1, 2, 0, 0}

N = 6
None

N = 7
{3, 2, 1, 1, 0, 0, 0}

N = 8
{4, 2, 1, 0, 1, 0, 0, 0} 

N = 9
{5, 2, 1, 0, 0, 1, 0, 0, 0}

N = 10
{6, 2, 1, 0, 0, 0, 1, 0, 0, 0}

N = 11
{7, 2, 1, 0, 0, 0, 0, 1, 0, 0, 0}

N = a
{ a-4, 2, 1, <a-7 0s>, 1, 0, 0, 0 }

似乎我们有属性

sum(A[i]) = n = sum(i * A[i])

A[0] = sum( (i-1) * A[i] ) i>=2

2 个答案:

答案 0 :(得分:0)

外循环:生成长度为n的所有候选。这可以使用任何方便的固定产品软件来完成;您需要{:{1}}元素,其范围为0:n-1。对于每个候选人,请过滤并检查(如下)。

过滤器

  • 候选元素的总和必须等于n。请注意,如果您要编写自己的候选生成器,则可以使用它极大地减少候选者的数量。
  • 第一个元素永远不能为0。

检查: 依次计算每个数字0:n-1的数量。结果列表是您的支票计数。如果此列表与原始候选列表相同,则您有解决方案:将其打印出来。

快捷方式: 您可以使用已知结果吗?长期以来证明,对于n> = 7,给出的公式是唯一的解决方案:您可以直接生成一个解决方案并返回。对于n <7,蛮力将很快产生所有有效的解。

答案 1 :(得分:0)

function valueCountMap(arr) {
    let obj = {};
    for (let i = 0; i < arr.length; i++) {
        let temp = arr[i];
        let val = obj[temp];
        if (val) {
            obj[temp] += 1;
        } else {
            obj[temp] = 1;
        }

    }
    return obj;
}


function isSelfAware(arr) {
    let map = valueCountMap(arr);

    for (const key in map) {
        if (map.hasOwnProperty(key)) {
            const found = map[key]; 
            if (arr[key] !== found) {
                return false;
            }
            
        }
    }

    return true;
}

let arr1 = [7, 2, 1, 0, 0, 0, 0, 1, 0, 0, 0];
console.log(isSelfAware(arr1));