浅谈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中字符和数组一些基本算法题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。