美文网首页
JS代码题6

JS代码题6

作者: twentyshaw | 来源:发表于2019-11-18 13:58 被阅读0次

    字符串查找

    请使用最基本的遍历来实现判断字符串 a 是否被包含在字符串 b 中,并返回第一次出现的位置(找不到返回 -1)。

    a='34';b='1234567'; // 返回 2
    a='35';b='1234567'; // 返回 -1
    a='355';b='12354355'; // 返回 5
    isContain(a,b);
    

    题目要求实现的功能其实就是String的indexOf()方法,所以:

    function isContain(strA,strB){
        return strB.indexOf(strA)
    }
    

    但是题目要求“最基本的遍历来实现”,所以不能使用indexOf()方法。用遍历来实现的话:

    function isContain(strA,strB){
        var arrA = strA.split('')
        var arrB = strB.split('')
        var flag,temp
        for(var j in arrB){
            if (arrA[0] === arrB[j]) {
                temp = parseInt(j) //注意这里的j是一个字符串。。它居然是个字符串
                flag = true
            }
        }
        var index = temp + 1
        for (var i = 1; i < arrA.length; i++){
            if (arrA[i] !== arrB[index++]) {
                flag = false
            }
        }
        if (flag) {
            return temp
        }else{
            return -1
        }
    }
    

    自己在写这个代码的过程中犯了一个错误:

    • for(in)循环索引是字符串而不是整数。并且我不应该用for in循环来遍历一个数组。
      所以代码最好改写成:
    function isContain(strA,strB){
        var arrA = strA.split('')
        var arrB = strB.split('')
        var flag,temp
        for (var k = 0; k < arrB.length; k++) {
            if (arrB[k] === arrA[0]) {
                temp = j
                flag = true
            }
        }
        var index = temp + 1
        for (var i = 1; i < arrA.length; i++){
            if (arrA[i] !== arrB[index++]) {
                flag = false
            }
        }
        if (flag) {
            return temp
        }else{
            return -1
        }
    }
    

    然后还有几个要注意的点:

    • 用temp来记录匹配的起始位置
    • 用flag来判断输出
    • 最开始我想比较数组arrA和数组arrB的时候一直找不到好的方法。我试过外部遍历arrA然后在内部遍历arrB但是出错了。后来我发现我并不需要遍历arrB(我不需要拿到它的所有项目,也不需要它的length),我只要将arrA中的每一项与arrB的项依次对比就可以了。所以使用了arrB[index++]。(注意index的初始值为temp+1)

    相关文章

      网友评论

          本文标题:JS代码题6

          本文链接:https://www.haomeiwen.com/subject/vtavictx.html