与 1 共舞
问题描述:对于给定正整数 n,计算长度为 n 的 0-1 字符串中有多少个与 1 共舞的数字。
与 1 共舞 :每个 0 左边必须要有一个 1 与其相邻
如:
n=3, 生成的字符串组合有 000,001,010,011,100,101,110,111。与 1 共舞的 有 110 111,101.
n=1 , 组合 0,1 与 1 共舞的 1
我们通过构造组合发现如下规律
1 2 3 4
| 000 100 010 001 110 101 011 111
|
可以看到它的构造是有规律的,以 000 为根,进行广度优先遍历。横向遍历,纵向递归。
横向遍历:直到 变化到最后一位
纵向递归:一上一次替换之后的字符串为基础,保持已经替换的,开始从未替换的开始,直到变化到最后一位
与 1 共舞的条件也容易:
遍历组合,如果当前是 0 且 前一位是 0,那么不是,或者 如果当前位 0,且第一位为 0,那么不是 与一共舞的组合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| function outputWithOneUnitBody(n) { let initStrArr = new Array(n).fill(0); insteadOfStr(initStrArr, 0, n); } function insteadOfStr(strArr, changeIndex, n) { if (changeIndex === n) { return; } else { for (let h = changeIndex; h < n; h++) { let replaceStr = strArr.concat(); replaceStr.splice(h, 1, 1); if (isWithOne(replaceStr)) { console.log(replaceStr); } insteadOfStr(replaceStr, h + 1, n); } } }
function isWithOne(arr) { for (let i = 0; i < arr.length; i++) { if ((arr[i] === 0 && i === 0) || (arr[i] === 0 && arr[i - 1] === 0)) { return false; } }
return true; }
generateCompose(5);
|
总结
应该是求二进制数的过程去判断才对,我这个想法太直接了,只是实现了而已,完全不考虑什么算法复杂度