Missing letters

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

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

function fearNotLetter(str) {
  var len=str.length;
  //str中第一个字符的Unicode值
  var start=str.charCodeAt(0);
  //str中最后一个字符的Unicode值
  var end=str.charCodeAt(len-1);
  var arr=[];
  var j=0;
  for(var i=start;i<=end;i++){
    //循环遍历,如果str中字符不等于Unicode值i对应的字符
    //说明str中该字符缺失,push入str数组中
    //注意:str中数组下标j要保持不变,继续与下一个Unicode值所对应的字符比较
    if(str[j]!=String.fromCharCode(i)){
      arr.push(String.fromCharCode(i)); 
      //为了保持下标j不变,这里要减1,因为循环会自动加1
      j--;
    }
    j++;
  }
  if(arr.length===0)
    return undefined;
  else
    //return arr.toString();
    return arr.join('');  
}

fearNotLetter("abcdefgho");

提示

String.charCodeAt()

String.fromCharCode()

思路

如果传进来的字母序列只漏掉一个字符的话,这道题目还是很容易解决的,不用很多代码量就能验证通过。但是,题面说的是“找到缺失的字母”而不是“找到缺失的单个字母”,所以出于解题的完整性考虑,即使测试题目中验证的也都是缺失单个字符的情况,我们还是用数组解决它,使得即使缺失了多个字符也能返回正确结果。

把传入的字母序列转化为数组;声明空数组,准备推入值作为最后的返回结果:

var arr = str.split("");
var temp = [];

假设传入的是一个字母序列连续的字符串,那么它的每个字符的 unicode 值应当是依次递增 1 的。

//字符串首位字符编码
var start = str.charCodeAt(0);
//字符串末尾字符编码
var end = str.charAt(str.length - 1).charCodeAt(0);
for(var i = start; i < end + 1; i++){
    //do something...
  }

解释一下这个 for() 循环的条件。这里把传入的 str 当做一个字母序列连续的字符串看待。 i 代表当前字符的字符编码,即 unicode 值。

我们来看一下循环内部应该进行的操作:

var item = String.fromCharCode(i);
    if(arr[0] !== item){  
      temp.push(item);
    }else{
      arr.shift();
    }

item 是当前字符串是 unicode 值依次递增的连续字符串的情况下,当前项的值。

如果当前项的值就是字符串首项,说明它不是我们要找的值,移除str转化的数组arr的首项;如果它不是字符串首项,说明这个位置本应该出现的值被其它值顶替,把这个位置本应该出现的值收入将要返回的结果集中。

整个函数的返回值需做以下判断:

if(temp.length === 0){
    return undefined;
  }else{
    return temp.join("");
  }


function fearNotLetter(str) {
  var arr = str.split("");
  var temp = [];
  var start = str.charCodeAt(0);
  var end = str.charAt(str.length - 1).charCodeAt(0);
  for(var i = start; i < end + 1; i++){
    var item = String.fromCharCode(i);
    if(arr[0] !== item){  
      temp.push(item);
    }else{
      arr.shift();
    }
  }
  if(temp.length === 0){
    return undefined;
  }else{
    return temp.join("");
  }  
}
原文地址:https://www.cnblogs.com/fffangrui/p/6110329.html