Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 一个数字有多少种不同的解码方式_Javascript - Fatal编程技术网

Javascript 一个数字有多少种不同的解码方式

Javascript 一个数字有多少种不同的解码方式,javascript,Javascript,我很困惑,不知道该怎么办。下面的代码是我在考虑解决方案时记下的 下面是一个带有示例的问题: 包含来自A-Z的字母的消息 正在使用以下映射编码为数字: ‘A’->1 ‘B’->2 ... ‘Z’->26 给定一个只包含数字的非空字符串,确定解码该字符串的方法总数 例1: 输入:“12” 产出:2 说明:它可以被解码为“AB”(12)或“L”(12)。 例2: 输入:“226” 产出:3 说明:它可以被解码为“BZ”(226)、“VF”(226)或“BBF”(26) const numdecodes

我很困惑,不知道该怎么办。下面的代码是我在考虑解决方案时记下的

下面是一个带有示例的问题:

包含来自A-Z的字母的消息 正在使用以下映射编码为数字:

‘A’->1 ‘B’->2 ... ‘Z’->26

给定一个只包含数字的非空字符串,确定解码该字符串的方法总数

例1:

输入:“12” 产出:2 说明:它可以被解码为“AB”(12)或“L”(12)。 例2: 输入:“226” 产出:3 说明:它可以被解码为“BZ”(226)、“VF”(226)或“BBF”(26)

const numdecodes=(s)=>{
//常量字母='abcdefghijklmnopqrstuvwxyz'。拆分(“”)
////用字母写一个对象。数字是键,字母是值
常量alphaObject={
1:'a',2:'b',3:'c',4:'d',5:'e',6:'f',7:'g',8:'h',9:'i',
10:j,11:k,12:l,13:m,14:n,15:o,16:p,17:q,
18:r',19:s',20:t',21:u',22:v',23:w',24:x',25:y',26:z'
};
const countObj={};
//console.log()
如果(s>=“11”){
s、 拆分(“”);
如果(!countObj[alphaObject[s]]){
返回(countObj[alphaObject[s]]=1);
}
//我返回长度是因为
//我从示例中注意到输出与长度匹配。
//因为每个数字代表一个字母。
//每封信都是解决问题的一种方法
}如果(s=4),则为{
////测试用例1223
////abbc
////lw
////abw
////lbc
////avc
////返回s.length+2
//s.alphaObject
// }
};
//测试用例0的错误设置
console.log(数字编码(“14”));

我建议使用有限自动机对问题进行建模,如上图所示。程序从状态0开始,逐个解析输入字符。如果读取箭头上显示的字符,它可以移动到另一个状态。机器只能在最终状态S0下完成。现在我们可以计算可能的路径数。下面是JavaScript中的一个示例实现:

function count(input) {
    return decodingState0(input);
}

function decodingState0(input) {
    if (input.length === 0) {
        return 1;
    }
    const firstNumber = parseInt(input[0]);
    const remaining = input.substring(1);
    let numberPossibilities = 0;
    if (firstNumber > 0) {
        numberPossibilities += decodingState0(remaining);
    }
    if (firstNumber === 1) {
        numberPossibilities += decodingState1(remaining);
    } else if (firstNumber === 2) {
        numberPossibilities += decodingState2(remaining)
    }
    return numberPossibilities;
}


function decodingState1(input) {
    if (input.length === 0) {
        return 0;
    }
    return decodingState0(input.substring(1));
}


function decodingState2(input) {
    if (input.length === 0 || parseInt(input[0]) > 7) {
        return 0;
    }
    return decodingState0(input.substring(1));
}

这可以通过递归方式完成:

  • 查看字符串长度是否比返回值1为空,因为拆分是有效的

  • 如果它是以第一个位置的“0”开头的字符串,则这不能是任何解决方案,因为(仅允许1-26)=>返回false

  • 如果长度为1,则可能(1-9)=>返回1

  • 看看不带第一个字符的字符串是否是递归的可能解决方案 看看是否有两位数的二次分割法。

  • 如果字符串长度至少为2个字符,且整数值最大为26,则这可能是一个解决方案,请在不使用前2个字符的情况下继续递归

  • 现在看看两个try是否都不是false=>将两个返回结果相加

  • 如果只有第二个值不是false=>则返回此结果

  • 否则返回第一个结果

函数numdecodes(字符串){
if(string.length==0)
返回1;
else if(string.charAt(0)='0')
返回false;
else if(string.length==1)
返回1;
设one=numdecodes(string.slice(1));
设test=parseInt(string.substr(0,2));
如果(字符串长度>=2&&test3
console.log(numdecodes('1223'));/1,2,2,3/12,2,3/12,23/1,22,3/1,2,23=>5

console.log(numdecodes('1203');//1,20,3=>1
通信字母/单词必须有一个消除器(空格、逗号等),或者必须有一个固定的空间量(每个字母1个字符,每个字符8位,等等),这是一个硬要求


如果没有这些,你就无法进行有效的交流。

问题不是可以归结为“你可以用多少种不同的方式将一串数字分割成1到26之间的数字?”我想这只是“排列”的问题最后。@enhzflep-Hi,是的!Hi@Sascha,谢谢你的回答!我不明白为什么这样:如果(string.length==0)返回1?我需要一个递归的终止,这是字符串为空的时候(length==0)。我返回1是因为这是一个可能的解决方案,所以我将1传播到以前的级别(使用1或2个字符)。注意:在我通过可能的解决方案之前,我不会将1的回报加总到这个水平。我正在尝试在算法方面做得更好。您是否有任何资源可以与我共享,以便我可以做得更好并能够编写这样的解决方案?
function count(input) {
    return decodingState0(input);
}

function decodingState0(input) {
    if (input.length === 0) {
        return 1;
    }
    const firstNumber = parseInt(input[0]);
    const remaining = input.substring(1);
    let numberPossibilities = 0;
    if (firstNumber > 0) {
        numberPossibilities += decodingState0(remaining);
    }
    if (firstNumber === 1) {
        numberPossibilities += decodingState1(remaining);
    } else if (firstNumber === 2) {
        numberPossibilities += decodingState2(remaining)
    }
    return numberPossibilities;
}


function decodingState1(input) {
    if (input.length === 0) {
        return 0;
    }
    return decodingState0(input.substring(1));
}


function decodingState2(input) {
    if (input.length === 0 || parseInt(input[0]) > 7) {
        return 0;
    }
    return decodingState0(input.substring(1));
}