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");
欢迎交流指正.......