free code camp Missing letters问题解答

本文介绍了一种算法,用于从给定的字母序列中找出所有缺失的字母,并详细解释了两种实现方法:逐个比较字母的ASCII值和使用过滤法建立完整字母序列再对比缺失项。

Missing letters 


从传递进来的字母序列中找到缺失的字母并返回它。

如果所有字母都在序列中,返回 undefined。

 

网上搜的一些答案,往往不能满足符合条件输入都有符合条件的输出

比如:abe  应该返回cd;但大多只返回c

abcgi应该返回defh;但有的只返回了def

借鉴他们的思路,写了一个,完成了任务;不过没考虑时间复杂度优化问题

抛砖引玉,看到的可以动手改改....

这是一些对你有帮助的资源:

思路:

把字符串转为字母数组

比较相邻两个字母元素的charcode之差

如果差等于1,说明两个字母中间没有缺失字母,不做处理

如果差不等于1,则说明二者之间缺失字母

缺失的第一个字母的charcode等于前一个字母的charcode+1

缺失的最后一个字母的charcode等于后一个字母的charcode-1

通过循环把缺失的字母加入到一个字符串变量newStr中

最后判断newStr,如果为空就返回undefined

否则返回newStr

  • function fearNotLetter(str){
        var arr=str.split("");
        var newStr="";//输出的字符串
        for(var i=1;i<arr.length;i++){
            //相邻的两个字符元素的charcode
            var afterCharCode=arr[i].charCodeAt();
            var beforeCharCode=arr[i-1].charCodeAt();
            var diff=afterCharCode-beforeCharCode;
           
            if(diff!=1){//相邻字母不连续,中间缺失字母
                var start= beforeCharCode+1;//缺失字母的起点
                var end=afterCharCode-1;//缺失字母的终点
               
                for(var j=0;j<=end-start;j++){//将缺失的字母添加到字符串newStr中
                    newStr+=String.fromCharCode(start+j);
                } 
            }
        }
        if(newStr===""){
            return undefined;
        }else{
            return newStr;
        }
        
    }
            fearNotLetter("abcgz");

    方法二:过滤法

  • 以给定字符串的起始和末尾元素建立一个不缺失任何元素的新数组

  • 比如str="abf";转为数组arr1=['a','b','f'];

  • 建立一个数组arr2=['a','b','c','d','e','f']

  • 过滤这个数组,arr2;过滤条件是arr2独有的元素留下(即arr2中有,而arr1中没有的)

  • function fearNotLetter(str){
        var arr1=str.split("");
        var start=arr1[0].charCodeAt();
        var end=arr1[arr1.length-1].charCodeAt();
        //创建一个数组arr2,字母是完全连续的,数组的第一个元素和最后一个元素分别和arr1的起始和结束元素相同
        var arr2=new Array(end-start+1);
        for(var i=0;i<arr2.length;i++){//动态初始化数组元素
            arr2[i]=String.fromCharCode(start+i);
        }
       
        //过滤数组arr2,返回数组arr1中没有的元素
    
        var arr=arr2.filter(function(val){//过滤后的数组
            console.log(arr1.indexOf(val)==-1);
           return arr1.indexOf(val)==-1;
        });
        if(arr.length===0){
            return undefined;
        }else{
            return arr.join("");
        }
    }
    fearNotLetter("abce");

    欢迎交流指正.......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值