浅谈js中字符和数组一些基本算法题
最近在刷fcc的题,跟升级打怪一样,一关一关的过,还挺吸引我的。今天抽时间把BasicAlgorithmScritping 这部分题做了,根据一些提示,还是比较简单的。有些题的处理方式方法,我想值得借鉴。比如在项目中有时候要处理一个字符,如果想不到一些相关的方法,还挺费事的,所以,在此记录下来,如果以后遇到一些字符或者数组处理,可以来翻翻这篇文章,希望以此得到一些提示而不是去翻文档。
看到此博文的博友,有更好更简单的代码或者好的想法,请留言交流(我一直觉得只有学习别人的优秀代码才能进步更快,思维更灵活)。对于初学者,不看代码自己试着做一遍呗。(以下题目都不用考虑参数类型,严格来说应该对参数类型做一个判断,eg:typeOf(arg)===number)
1.ReverseaString
翻转字符串
先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串。
你的结果必须得是一个字符串
functionreverseString(str){
str=str.split('').reverse().join('');
returnstr;
}
reverseString("hello");
2.CheckforPalindromes
如果给定的字符串是回文,返回true,反之,返回false。
如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。
注意你需要去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文。
函数参数的值可以为"racecar","RaceCar"和"raceCAR"。
functionpalindrome(str){
//Goodluck!
str=str.replace(/[\|\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?]/g,"");//去除标点符号,这是我百度的,js的正则不是很熟悉
str=str.replace(/\s+/g);
str=str.toLowerCase();
vararr=str.split('');
arr=arr.reverse();
varstr1=arr.join("");
if(str===str1){
returntrue;}
returnfalse;
}
palindrome("eye");
/*
palindrome("eye")应该返回一个布尔值
palindrome("eye")应该返回true.
palindrome("racecar")应该返回true.
palindrome("notapalindrome")应该返回false.
palindrome("Aman,aplan,acanal.Panama")应该返回true.
palindrome("neveroddoreven")应该返回true.
palindrome("nope")应该返回false.
palindrome("almostomla")应该返回false.
palindrome("Myageis0,0siegaym.")应该返回true.
palindrome("1eyeforof1eye.")应该返回false.
palindrome("0_0(:/-\:)0-0")应该返回true.
*/
3.TitleCaseaSentence
确保字符串的每个单词首字母都大写,其余部分小写。(eg:titleCase("I'malittleteapot")应该返回"I'mALittleTeaPot". titleCase("sHoRtAnDsToUt")应该返回"ShortAndStout".)
/*这题很简单,主要是要明白split()是把字符串分割成数组
join()是把数组变成字符串
toLowerCase()toUpperCase()大小写转换,注意,只对字母有效,其他字符(eg:/,!@)无效
*/
functiontitleCase(str){
str=str.split("");//按照空格把字符串分割成数组
for(vari=0;i<str.length;i++){
str[i]=str[i].toLowerCase();
str[i]=str[i].substring(0,1).toUpperCase()+str[i].substring(1);
}
returnstr.join("");//通过空格把数组连接成字符串
}
titleCase("I'malittleteapot");
4.ConfirmtheEnding
检查一个字符串(str)是否以指定的字符串(target)结尾。
如果是,返回true;如果不是,返回false。例如:confirmEnding("Bastian","n")应该返回true. confirmEnding("Connor","n")应该返回false. confirmEnding("Walkingonwateranddevelopingsoftwarefromaspecificationareeasyifbotharefrozen","specification")应该返回false.
functionconfirmEnding(str,target){
//"Nevergiveupandgoodluckwillfindyou."
//--Falcor
returnstr.substr(str.length-target.length)==target?true:false;
}
confirmEnding("Bastian","n");
confirmEnding("Hehastogivemeanewname","na");
/*
confirmEnding("Bastian","n")应该返回true.
confirmEnding("Connor","n")应该返回false.
confirmEnding("Walkingonwateranddevelopingsoftwarefromaspecificationareeasyifbotharefrozen","specification")应该返回false.
confirmEnding("Hehastogivemeanewname","name")应该返回true.
confirmEnding("Hehastogivemeanewname","me")应该返回true.
confirmEnding("Hehastogivemeanewname","na")应该返回false.
confirmEnding("Ifyouwanttosaveourworld,youmusthurry.Wedontknowhowmuchlongerwecanwithstandthenothing","mountain")应该返回false.
*/
5.Repeatastringrepeatastring
重要的事情说3遍!
重复一个指定的字符串num次,如果num是一个负数则返回一个空字符串。例如:
repeat("*",3)应该返回"***".
repeat("abc",3)应该返回"abcabcabc".
repeat("abc",4)应该返回"abcabcabcabc".
repeat("abc",1)应该返回"abc".
repeat("*",8)应该返回"********".
repeat("abc",-2)应该返回"".
当你完成不了挑战的时候,记得开大招'Read-Search-Ask'。
这是一些对你有帮助的资源:
•GlobalStringObject
functionrepeat(str,num){
//repeatafterme
varnewstr=str;
if(num>1){
for(vari=1;i<num;i++){
str+=newstr;
}
returnstr;
}elseif(num==1){
returnstr;
}else{
return"";
}
}
repeat("abc",3);
repeat("*",3);
6.ChunkyMonkey
猴子吃香蕉可是掰成好几段来吃哦!
把一个数组arr按照指定的数组大小size分割成若干个数组块。
例如:chunk([1,2,3,4],2)=[[1,2],[3,4]];
chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]];
functionchunk(arr,size){
//Breakitup.
vararr1=[];
for(vari=0;i<arr.length;i=i+size){
vararr2=arr;
arr1.push(arr2.slice(i,i+size));
}
returnarr1;
}
chunk(["a","b","c","d"],2);
7.FalsyBouncer
真假美猴王!
删除数组中的所有假值。
在JavaScript中,假值有false、null、0、""、undefined和NaN。
当你完成不了挑战的时候,记得开大招'Read-Search-Ask'。
这是一些对你有帮助的资源:
•BooleanObjects
•Array.filter()
例如:
bouncer([7,"ate","",false,9])应该返回[7,"ate",9].
bouncer(["a","b","c"])应该返回["a","b","c"].
bouncer([false,null,0,NaN,undefined,""])应该返回[].
bouncer([1,null,NaN,2,undefined])应该返回[1,2].
/*
这题注意是对filter的理解,这是我最开始的代码,写的不是很好,没多大参考价值
还要注意NaN比较。自己不等于自己(NaN!=NaN)
*/
functionbouncer(arr){
//Don'tshowafalseIDtothisbouncer.
vararr1=[];
varj=0;
arr.filter(function(val,index){
if(val===false||val===null||val===0||val===""||val===undefined||val!==val){
arr1.push(index);
}
});
varlen=arr1.length;
for(vari=0;i<len;i++){
arr.splice(arr1[i]-j,1);
j++;
}
returnarr;
}
bouncer([7,"ate","",false,9]);
8.SeekandDestroy
金克斯的迫击炮!
实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值。
例如:
destroyer([1,2,3,1,2,3],2,3)应该返回[1,1].
destroyer([1,2,3,5,1,2,3],2,3)应该返回[1,5,1].
destroyer([3,5,1,2,2],2,3,5)应该返回[1].
destroyer([2,3,2,3],2,3)应该返回[].
destroyer(["tree","hamburger",53],"tree",53)应该返回["hamburger"].
这是一些对你有帮助的资源:
•Argumentsobject
•Array.filter()
functiondestroyer(arr){
//Removeallthevalues
vartempArguments=arguments;
returnarr.filter(function(entry){
for(vari=1;i<tempArguments.length;i++){
if(entry==tempArguments[i]){
returnfalse;
}
}
returntrue;
});
}
destroyer([1,2,3,1,2,3],2,3);
9.WheredoIbelong
我身在何处?
先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引。
举例:where([1,2,3,4],1.5)应该返回1。因为1.5插入到数组[1,2,3,4]后变成[1,1.5,2,3,4],而1.5对应的索引值就是1。
同理,where([20,3,5],19)应该返回2。因为数组会先排序为[3,5,20],19插入到数组[3,5,20]后变成[3,5,19,20],而19对应的索引值就是2。
这是一些对你有帮助的资源:
•Array.sort()
functionwhere(arr,num){
//Findmyplaceinthissortedarray.
//注意sort()排序规则
arr.sort(function(a,b){
returna-b;
});
for(vari=0;i<arr.length;i++){
if(arr[i]>num|arr[i]==num){
returni;
}
}
returnarr.length;
}
where([5,3,20,3],5);
10.CaesarsCipher
让上帝的归上帝,凯撒的归凯撒。
下面我们来介绍风靡全球的凯撒密码Caesarcipher,又叫移位密码。
移位密码也就是密码中的字母会按照指定的数量来做移位。
一个常见的案例就是ROT13密码,字母会移位13个位置。由'A'↔'N','B'↔'O',以此类推。
写一个ROT13函数,实现输入加密字符串,输出解密字符串。
所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,跳过它们。
例如:
rot13("SERRPBQRPNZC")应该解码为"FREECODECAMP"
rot13("SERRCVMMN!")应该解码为"FREEPIZZA!"
rot13("SERRYBIR?")应该解码为"FREELOVE?"
rot13("GURDHVPXOEBJAQBTWHZCRQBIREGURYNMLSBK.")应该解码为"THEQUICKBROWNDOGJUMPEDOVERTHELAZYFOX."
这是一些对你有帮助的资源:
•String.charCodeAt()
•String.fromCharCode()
functionrot13(str){//LBHQVQVG!
vararr=str.toUpperCase().split("");
varstr1=[];
for(vari=0;i<arr.length;i++){
vararr1=arr[i].split("");
for(varj=0;j<arr1.length;j++){
varnum=arr1[j].charCodeAt();
if(num>=65&&num<=90){
arr1[j]=num+13>90?String.fromCharCode(64+(num+13-90)):String.fromCharCode(num+13);//64+(num+13-90)要明白为什么是64,
}
}
str1.push(arr1.join(""));
}
returnstr1.join("");
}
//Changetheinputsbelowtotest
rot13("SERRPBQRPNZC");
以上这篇浅谈js中字符和数组一些基本算法题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。