笔记
function guo(str){ // 输入举例:str = '1??0?101' 2*7--2*8 var len = str.length;//字符串长度 var arr = [];//数组用来保存最终输出的二进制数 var end = Math.pow(2,len);//2的len次方 var _str = str.split('').reverse().join(''); //字符串去反 即:'101?0??1' var obj = {}; //存放非'?'的位置及数值信息 console.log('_str:', _str);//'101?0??1' for(var index in _str){ if(_str[index] != '?'){ obj[index] = _str[index] } }//for循环获取非'?'的位置及数值信息存到obj console.log('obj:', obj); //{ '0': '1', '1': '0', '2': '1', '4': '0', '7': '1' } for(var i=Math.pow(2,len-1); i< end; i++){ if(isRight(i, obj)){ console.log('i:',i); arr.push(i.toString(2));//满足题设条件就要存起来 } }//for 遍历可能满足条件的所有数 console.log('arr:', arr) return arr;//函数输出 } function isRight(num, obj){ var flag = true;//标识num这个数是否满足条件 Object.keys(obj).forEach(function(key){//遍历obj var deno = Math.pow(2, Number(key));//分母 if(Math.floor(num/deno)%2 != Number(obj[key])){ flag = false;//有其中一位的数值不满足条件就舍弃 return false;//退出forEach循环 } }); return flag;//数字num是否满足obj条件,如果满足返回true } guo('1??0?101');//执行算法
工欲善其事 必先利其器