我使用不同的方法解决了一个问题。我想知道哪种方法更好。
我相信从时间复杂度上来说,第一种方式效率更高,但是代码很长,看起来很乱,但是少用了1个for循环。 第二种方法使用 3 个 for 循环,但代码看起来干净得多。 我想问你认为哪种代码更好,比如我们是否应该优先考虑高效但混乱的代码,或者效率较低但更容易阅读的代码。
这是问题陈述:
给定一个字符串单词数组,返回可以仅在美式键盘的一行上使用字母表字母输入的单词,如下图所示。
在美式键盘中:
第一行由字符“qwertyuiop”组成, 第二行由字符“asdfghjkl”组成,并且 第三行由字符“zxcvbnm”组成。
第一种方法(凌乱但有效):
var findWords = function(words) {
const first_row = "qwertyuiop";
const second_row = "asdfghjkl";
const third_row = "zxcvbnm";
let row = "first";
let accepted_words = [];
words.forEach((word) => {
for (var i = 0; i < word.length; i++) {
if (i === 0) {
if (first_row.includes(word[i].toLowerCase())) {
if (i === word.length - 1) accepted_words.push(word);
row = "first";
} else if (second_row.includes(word[i].toLowerCase())) {
if (i === word.length - 1) accepted_words.push(word);
row = "second";
} else if (third_row.includes(word[i].toLowerCase())) {
if (i === word.length - 1) accepted_words.push(word);
row = "third";
} else {
break;
}
} else {
if (first_row.includes(word[i].toLowerCase()) && row === "first") {
if (i === word.length - 1) accepted_words.push(word);
} else if (second_row.includes(word[i].toLowerCase()) && row === "second") {
if (i === word.length - 1) accepted_words.push(word);
} else if (third_row.includes(word[i].toLowerCase()) && row === "third") {
if (i === word.length - 1) accepted_words.push(word);
} else {
break
}
}
}
});
return accepted_words;
}
第二种方法(效率较低):
var findWords = function(words) {
const rows = ["qwertyuiop", "asdfghjkl", "zxcvbnm"];
let accepted_words = [];
words.forEach((word) => {
for (row of rows) {
for (var i = 0; i < word.length; i++) {
if (row.includes(word[i].toLowerCase())) {
if (i === word.length - 1) {
accepted_words.push(word);
}
} else {
break
}
}
}
});
return accepted_words;
}