Javascript 翻转0';s和1';这是一个自然数
我想创建一个javascript函数,以自然数将1翻转为0,我没有办法实现这一点,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
事实上,我有几个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