哪个代码更好?效率与代码可读性

问题描述 投票:0回答:1

我使用不同的方法解决了一个问题。我想知道哪种方法更好。

我相信从时间复杂度上来说,第一种方式效率更高,但是代码很长,看起来很乱,但是少用了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;
}
javascript coding-style
1个回答
0
投票

您的第一个片段实际上并没有更有效。当然,它少了 1 个

for
,但它有 6 个
if
。这只是“展开循环”,这是可能的,因为它是在固定大小的数组上循环的。两种解决方案都具有恒定的复杂性 (O(1))。
    

© www.soinside.com 2019 - 2024. All rights reserved.