【发布时间】:2016-06-09 15:17:51
【问题描述】:
我正在尝试完成一个代码挑战,我必须将手机 t9 输入的击键解码为字符以创建文本消息。主函数(reverse_t9)接受一串键,例如“44 444”或“999337777”,我需要将它们翻译成相应的文本(分别为“hi”或“yes”)。
我的所有逻辑都已关闭,可以生成正确的输出,但挑战是告诉我我超过了 4000 毫秒的时间限制。我找到了几个可以提高性能的地方,但仍然无法达到这个标准。我认为最浪费时间的是我的“getLetterFromDigits”函数,它必须遍历我的数组才能找到一组击键的对应映射。
我是否遗漏了其他一些明显的性能问题?如果您需要更多信息,请告诉我。
function reverse_t9(keys) {
var retVal = "";
var maxKeystrokes = 3;
var splitKeystrokes = splitKeystrokesBySpacesAndKeys(keys);
for (i = 0, numSplits = splitKeystrokes.length; i < numSplits; i++){
//console.log("THIS SPLIT:");
//console.log(splitKeystrokes[i]);
//console.log("THIS LETTER:");
//console.log(getLetterFromDigits(splitKeystrokes[i]));
retVal = retVal + getLetterFromDigits(splitKeystrokes[i]);
}
return retVal;
}
function splitKeystrokesBySpacesAndKeys(keys) {
var retVal = [];
var lastKey = "";
var thisKey = "";
var lastSplit = 0;
var isSpace = 0;
for (i = 0, numKeys = keys.length; i <= numKeys; i++) {
thisKey = keys.substring(i, i + 1);
if (i == 0) {
// FIRST TIME AROUND, DO NOTHING ELSE, JUST ASSIGN LAST KEY
lastKey = thisKey;
} else {
if (thisKey != lastKey) {
if (thisKey != " ") {
if (lastKey != " ") {
retVal.push(keys.substring(lastSplit, i));
} else {
retVal.push(keys.substring(lastSplit, i - 1));
}
lastSplit = i;
}
lastKey = thisKey;
} else {
// KEY DID NOT CHANGE, ASSIGN LAST KEY AND CONTINUE ON
lastKey = thisKey;
}
}
}
return retVal;
}
function getLetterFromDigits(digits){
var retVal;
var digitMapping = [
{
digit: "1",
mapping: []
},
{
digit: "2",
mapping: ["a", "b", "c"]
},
{
digit: "3",
mapping: ["d", "e", "f"]
},
{
digit: "4",
mapping: ["g", "h", "i"]
},
{
digit: "5",
mapping: ["j", "k", "l"]
},
{
digit: "6",
mapping: ["m", "n", "o"]
},
{
digit: "7",
mapping: ["p", "q", "r", "s"]
},
{
digit: "8",
mapping: ["t", "u", "v"]
},
{
digit: "9",
mapping: ["w", "x", "y", "z"]
},
{
digit: "0",
mapping: ["*"]
}
];
var digit = digits.substring(0, 1);
for (i = 0, numMappings = digitMapping.length; i < numMappings; i++){
if (digitMapping[i].digit == digit){
retVal = digitMapping[i].mapping[digits.length - 1];
break;
}
}
return retVal;
}
【问题讨论】:
-
一方面,您可以创建一个简单的数组,而不是像那样设置映射列表的键。您正在映射字符串“0”到“9”——这是一个简单的数组查找。只需制作一个数组数组。
-
另外,您可以查看
keys.charAt(i)或简单的keys[i]是否更快,而不是keys.substring(i, i+1)。 -
哎呀...不知道 codereview。 @Pointy 你的意思是: var digitMapping = [['a','b','c'],['d','e','f']...]; ?
-
我能发现的最大问题是您忘记在所有三个循环中使用
var将i变量声明为本地变量。这很可能是运行时间极短的原因,尽管您一定很幸运仍然看到它 a) 终止和 b) 得到正确的结果。
标签: javascript arrays performance