JavaScript算法练习:Mutations

Mutations 对一个包含两个元素的数组,检测数组中的第二个元素的所有字母是否都在第一个元素中出现过,如果出现过,返回的是true,否则返回的是false。(其中忽略大小写)

简单分解一下:

  • 将目标字符串(数组中的第一个元素arr[0])和测试字符串(数组中的第二个元素arr[1])转换为小写字符串(通过toLowerCase())
  • 将数组中的两个元素分别转换为数组(通过split())
  • 使用for循环将测试字符串每个字符传入到目标字符串中搜索(通过indexOf())
  • 如果搜索传回值为负数,也就是indexOf()传来的值为-1,则返回false,也就是说测试字符串在目标字符串中没有匹配的字符串
  • 若全部字符串匹配(indexOf()的值大于或等于0),返回true

在这里主要运用到有关于JavaScript的知识:

这样就可以开始来写函数了。

function mutation (arr) {
    var baseStr = arr[0].toLowerCase().split('');
    var testStr = arr[1].toLowerCase().split('');

    /*
     * arr = ["Hello","hey"]
     * arr[0].toLowerCase().split('') => ["H", "e", "l", "l", "o"]
     * arr[1].toLowerCase().split('') => ["h", "e", "y"]
     * len = arr[1].length = 3
     */
    for (var i = 0, len = testStr.length; i < len; i++){
        var temp = baseStr.indexOf(testStr[i]);
        /*
         *  遍历次数  i=? i<len  testStr[i]   baseStr.indexOf(testStr[i])
         *  1st      0    yes    "h"            0
         *  2en      1    yes    "e"            1
         *  3rd      2    yes    "y"           -1
         *  4th      3     no
         *  end loop
         */
        if (temp === -1) {
            return false;
        }
    }
    return true;
}

做个测试,看看是否符合:

mutation(["hello","hey"]); // false
mutation(["hello","he"]);  // true
mutation(["abcdefghjiklmnopkrstuvwxyz","my name is damo"]); //false
mutation(["abcdefghjiklmnopkrstuvwxyz","mynameisdamo"]); //true

不用多说,看结果就知道,是我们需要的,也符合文章开头所说的需求。

上面的for循环,还可以换成for ... in方法。

function mutation (arr) {
    var baseStr = arr[0].toLowerCase().split(''),
        testStr = arr[1].toLowerCase().split('');

    for (var i in testStr) {
        var temp = baseStr.indexOf(testStr[s]);

        if (temp === -1) {
            return false;
        }
    }

    return true;
}

除了使用for循环之外,还可以使用Array.prototype.every()

function mutation (arr) {
    var baseStr = arr[0].toLowerCase().split(''),
        testStr = arr[1].toLowerCase().split('');
    return testStr.every(function (letter) {
        return baseStr.indexOf(letter) != -1;
    });
}

在JavaScript中有一个charAt()方法,可以返回字符串中指定位置的字符

var str = "hello";
for (var i = 0, len = str.length; i < len; i++) {
    console.log("字符串在index等于" + i + ": '" + str.charAt(i) + "'");
}

输出的结果

字符串在index等于0: 'h'
字符串在index等于1: 'e'
字符串在index等于2: 'l'
字符串在index等于3: 'l'
字符串在index等于4: 'o'

这样一来,在最开始的方法上稍做调整:

function mutation (arr) {
    var baseStr = arr[0].toLowerCase(),
        testStr = arr[1].toLowerCase();

    for (var i in testStr) {
        var temp = baseStr.indexOf(testStr.charAt(i));

        if (temp === -1) {
            return false;
        }
    }

    return true;
}

上面通过不同的方式方法实现文章开头所述的需求。这也是JavaScript算法练习之一,如果大家感兴趣也可以看看下面的视频。

如果您有更好的方案,欢迎在下面的评论中与我们一起分享。

大漠

常用昵称“大漠”,W3CPlus创始人,目前就职于手淘。对HTML5、CSS3和Sass等前端脚本语言有非常深入的认识和丰富的实践经验,尤其专注对CSS3的研究,是国内最早研究和使用CSS3技术的一批人。CSS3、Sass和Drupal中国布道者。2014年出版《图解CSS3:核心技术与案例实战》。

如需转载,烦请注明出处:http://www.w3cplus.com/javascript/mutations-in-javascript.html

返回顶部