Javascript 翻转0';s和1';这是一个自然数

Javascript 翻转0';s和1';这是一个自然数,javascript,math,recursion,numbers,integer,Javascript,Math,Recursion,Numbers,Integer,我想创建一个javascript函数,以自然数将1翻转为0,我没有办法实现这一点, 事实上,我有几个URL,我用1替换了查询参数中的所有0,现在我不再知道原始参数值,因为原始参数值中只有很少的1,现在两者都是混合的,所以基本上我搞砸了自己 对我来说,唯一的解决方案是尝试将每个1翻转到0,然后将0翻转到1,并将每个数字作为参数进行测试 这是参数值(将0替换为1后) 11422971 使用上面的输入,我想生成如下的数字,并测试其中的每一个 11422970 10422971 10422970 014

我想创建一个javascript函数,以自然数将1翻转为0,我没有办法实现这一点,
事实上,我有几个URL,我用1替换了查询参数中的所有0,现在我不再知道原始参数值,因为原始参数值中只有很少的1,现在两者都是混合的,所以基本上我搞砸了自己

对我来说,唯一的解决方案是尝试将每个1翻转到0,然后将0翻转到1,并将每个数字作为参数进行测试

这是参数值(将0替换为1后)

11422971

使用上面的输入,我想生成如下的数字,并测试其中的每一个

11422970
10422971
10422970
01422971


正如您所看到的,只有1和0在变化,根据二进制的变化,

您可以使用一个数字,比如字符串,在解析它之后,诸如此类

var number=“12551”; 编号=编号。替换(“1”、“0”)

编号结果将为“02550”


在将数字解析为int之后,这将生成所有置换

const generatePermutations=(number)=>{
让数字=数字。拆分(“”);
//找出哪些数字可以翻转
让digitPositions=digits.reduce((acc,val,i)=>{
如果(val=='0'| | val=='1')acc.push(i);
返回acc;
}, []);
//我们将按相反的顺序处理事情
数字位置。反向();
//我们可以翻转多少个数字
设noBits=digitPositions.length;
//排列数为2^n位,即3位表示2^3=8个排列。
让组合=数学功率(2,数字位置长度);
设置换=[];
//对于每个排列
对于(var p=0;p<组合;p++){
//复制此排列的数字
置换[p]=数字。切片();
//根据此排列的位位置设置每个可翻转位
//i=3=011(二进制)
对于(变量i=0;i>i)和1);
}
置换[p]=置换[p]。连接(“”);
}
返回置换;
};

log(generatePermutations('11422970')字符串中的每个位置都可以是
n
字符之一:

  • “0”
    可以是
    “0”
    “1”
  • “1”
    可以是
    “0”
    “1”
  • 任何其他字符
    c
    只能是
    c
我们可以将其存储在一个数组中:

"11422971" -> [ ["0", "1"], ["0, "1"], ["4"], ... ]
要将字符串转换为此格式,可以执行
拆分
映射

const chars = "11422971"
  .split("")
  .map(c => c === "1" || c === "0" ? ["1", "0"] : [ c ]);
获得此格式后,剩下的逻辑是从该数组创建所有可能的组合。有很多方法可以做到这一点(搜索“数组组合”或“排列”)。我选择显示一个递归模式:

const chars=“11422971”
.拆分(“”)
.map(c=>
c==“1”| c==“0”
? ["1", "0"]
:[c]
);
常量perms=([xs,…其他],s=“”,ps=[])=>
xs
? ps.concat(…xs.map(x=>perms(其他,s+x,ps)))
:ps.concat(s);

console.log(perms(chars))如果您正在寻找一种
递归方法:

function recursive(acc, first, ...rest) {
    if(!first) return acc;
    if(first == '0' || first == '1') {
        var acc0 = acc.map(x => x + '0');
        var acc1 = acc.map(x => x + '1');
        return recursive([].concat(acc0, acc1), ...rest);
    } else {
        return recursive(acc.map(x => x + first), ...rest); 
    }
}

recursive([''], ...'11422971')
// output ["00422970", "10422970", "01422970", "11422970", "00422971", "10422971", "01422971", "11422971"]

这只是二进制计数,并为每个值填写一个模板

函数getPossibleValues(str){ 函数getResult(n){ 设nIndex=0; const strValue=n.toString(2).padStart(nDigits,'0'); 返回str.replace(rxMatch,()=>strValue.charAt(nIndex++); } 常数rxMatch=/[01]/g; const nDigits=str.length-str.replace(rxMatch,,).length; const nMax=Math.pow(2,ndigit); 常量arrResult=[];
因为(让n=0;n谢谢大家的回应,你救了我的命,顺便说一句,我用的方法是

0-将数字转换为字符串。(这样我们可以执行类似split()的字符串操作)

1-计算字符串中1的数量(假设字符串为“11422971”,因此我们得到三个1,我使用split('1')-1进行计算)

2-生成三位长度的二进制文件(即从000到111)。三位来自步骤1

2-将字符串分解为单个字符,(我们将 数组=['1','1','4','2','2','9','7','1'])

3-取第一个二进制数(即b=0b000)

4-将字符数组中的第一个1替换为b的第一个二进制数字(即将1替换为0),同样地,将第二个1替换为b的第二个二进制数字,依此类推

5-我们将获得第一个组合(即“00422970”)

5-对我们在步骤2中生成的所有二进制数重复步骤3和4