从传递进来的字母序列中找到缺失的字母并返回它。
如果所有字母都在序列中,返回 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");
提示
思路
如果传进来的字母序列只漏掉一个字符的话,这道题目还是很容易解决的,不用很多代码量就能验证通过。但是,题面说的是“找到缺失的字母”而不是“找到缺失的单个字母”,所以出于解题的完整性考虑,即使测试题目中验证的也都是缺失单个字符的情况,我们还是用数组解决它,使得即使缺失了多个字符也能返回正确结果。
把传入的字母序列转化为数组;声明空数组,准备推入值作为最后的返回结果:
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(""); } }