Javascript 将数字映射到字符
我想用这种方式将这个数字“12145”映射到字符 12145->1,2,1,4,5->a,b,a,d,e 也可以是 12145->12,1,4,5->l,a,d,e 也可以是 12145->12,14,5->l,m,e 等等, 但是12145不能是1,2,1,45,因为字母表中没有45的映射 有谁能解释一下生成这些排列的简单算法吗Javascript 将数字映射到字符,javascript,data-structures,permutation,Javascript,Data Structures,Permutation,我想用这种方式将这个数字“12145”映射到字符 12145->1,2,1,4,5->a,b,a,d,e 也可以是 12145->12,1,4,5->l,a,d,e 也可以是 12145->12,14,5->l,m,e 等等, 但是12145不能是1,2,1,45,因为字母表中没有45的映射 有谁能解释一下生成这些排列的简单算法吗 "12345" 基本上,首先我们想要得到大数字字符串的子字符串,长度为一个或两个字节,所以我们只从一个字节开始: ["1", "2","3","4","5"]
"12345"
基本上,首先我们想要得到大数字字符串的子字符串,长度为一个或两个字节,所以我们只从一个字节开始:
["1", "2","3","4","5"]
然后我们从左到右将其中两个分组:
["12","3","4","5"]
["12","34","5"]
我们继续从第二个字符开始,而不是从第一个字符开始:
["1","23","4","5"]
["1","23","45"]
我们重复这一步骤,直到最后一组,我们应该有所有的组合:
var val = (12345 +"").split("");//convert to string array
var result = [val.slice(0)];
//the start at loop:
for(var start = 0; start < val.length - 1; start++){
//join groups one after each other:
var grouped = [];
for(var i = start; i < val.length - 1; i+=2){
//group sth:
grouped.push( val.slice(i,i+2).join("") );
//generate the result:
result.push(
val.slice(0,start).concat(//the numbers before the grouping
grouped,//the grouped
val.slice(i+2)) //after grouping
);
}
}
基本上,首先我们想要得到大数字字符串的子字符串,长度为一个或两个字节,所以我们只从一个字节开始:
["1", "2","3","4","5"]
然后我们从左到右将其中两个分组:
["12","3","4","5"]
["12","34","5"]
我们继续从第二个字符开始,而不是从第一个字符开始:
["1","23","4","5"]
["1","23","45"]
我们重复这一步骤,直到最后一组,我们应该有所有的组合:
var val = (12345 +"").split("");//convert to string array
var result = [val.slice(0)];
//the start at loop:
for(var start = 0; start < val.length - 1; start++){
//join groups one after each other:
var grouped = [];
for(var i = start; i < val.length - 1; i+=2){
//group sth:
grouped.push( val.slice(i,i+2).join("") );
//generate the result:
result.push(
val.slice(0,start).concat(//the numbers before the grouping
grouped,//the grouped
val.slice(i+2)) //after grouping
);
}
}
您可以尝试获取单数或双数,并获取它们的字母值 它与带有两个参数的递归函数
fork
一起工作,left
和right
,而left
是给定字符串,right
是用于收集有效数字字符表示的部分组的临时数组
在函数fork
开始时,退出条件检查是否所有字符都已分发。在这种情况下,如果字符串left
的长度为0,则将临时数组right转换为字母字符串并推送到结果集,同时返回函数
主要部分基本相同,检查子字符串值是否有效(大于零且小于或等于26),然后使用不带新子字符串的字符串和包含新子字符串的数组再次调用递归函数
最后,result
包含所有可能的组合
函数getcompositions(字符串){
功能叉(左、右){
如果(!left.length){
push(right.map(函数(v){return(+v+9).toString(36);}).join(“”));
返回;
}
如果(+左[0]>0){
叉子(左。切片(1),右。贝壳(左[0]);
}
如果(left.length>=2&&+(left.slice(0,2))您可以尝试获取单数字或双数字,并获取它们的字母表值
它与带有两个参数的递归函数fork
一起工作,left
和right
,而left
是给定字符串,right
是用于收集有效数字字符表示的部分组的临时数组
在函数fork
的开头,一个退出条件检查是否所有字符都是分布式的。在这种情况下,如果字符串left
的长度为0,则将临时数组right转换为字母字符串并推送到结果集,同时返回函数
主要部分基本相同,检查子字符串值是否有效(大于零且小于或等于26),然后使用不带新子字符串的字符串和包含新子字符串的数组再次调用递归函数
最后,result
包含所有可能的组合
函数getcompositions(字符串){
功能叉(左、右){
如果(!left.length){
push(right.map(函数(v){return(+v+9).toString(36);}).join(“”));
返回;
}
如果(+左[0]>0){
叉子(左。切片(1),右。贝壳(左[0]);
}
如果(left.length>=2&&+(left.slice(0,2))这是家庭作业吗?规则是什么?为什么1
有时是a
,有时是1
?为什么12345
变成12,14,5
?你尝试了什么?更不用说12345->1,2,3,4,5我更新了帖子。一个问题的所有不同解决方案都称为排列。这可能会帮助你找到解决方案。是吗它是家庭作业?规则是什么?为什么1
有时是a
,有时是1
?为什么12345
变成12,14,5
?你尝试了什么?更不用说12345->1,2,3,4,5我更新了帖子。一个问题的所有不同解决方案都称为排列。这可能会帮助你找到解决方案。