整理下w3cschool上,编程挑战的算法
翻转字符串
先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串。
你的结果必须得是一个字符串
1 /*function reverseString(str) { 2 var arr=str.split(""); 3 arr.reverse(); 4 str=arr.join(""); 5 return str; 6 }*/ 7 8 function reverseString(str){ 9 var chars=new Array(100);//顺序栈 10 var top=-1;//顶指针 11 for(i=0;i<str.length;i++){ 12 chars[i]=str.charAt(i);//存数据 13 top++; 14 } 15 str="";//清空字符串 16 for(top;top>=0;top--){ 17 str+=chars[top];//取数据 18 } 19 return str; 20 } 21 22 reverseString("hello");
计算一个整数的阶乘
如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积。
阶乘通常简写成 n!
例如: 5! = 1 * 2 * 3 * 4 * 5 = 120
1 function factorialize(num) { 2 var temp=1; 3 for (var i=1;i<=num;i++){ 4 temp*=i; 5 } 6 num=temp; 7 return num; 8 } 9 10 factorialize(5);
1 //使用递归 2 function factorialize(num) { 3 if(num===1||num===0){ 4 return 1; 5 } 6 return factorialize(num-1)*num; 7 }
如果给定的字符串是回文,返回true,反之,返回false。
如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。
注意你需要去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文。
函数参数的值可以为"racecar","RaceCar"和"race CAR"。
1 function palindrome(str) { 2 // Good luck! 3 //字符串倒排序 4 5 //转换成小写字符串,同一大小写 6 //正则表达式不懂 7 var str1=str.toLowerCase(); 8 str1=str1.replace(/[\ |\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?]/g,""); 9 //分割成数组 10 var arr=str1.split(""); 11 12 //数组倒排序 13 arr.reverse(); 14 //转换字符串 15 var str2=arr.join(""); 16 17 //条件语句 18 /*if(str1==str2){ 19 return true;} 20 else{return false;}*/ 21 return(str1==str2); 22 } 23 24 25 26 palindrome("eye");
找到提供的句子中最长的单词,并计算它的长度。
函数的返回值应该是一个数字。
1 function findLongestWord(str) { 2 var arr=str.split(" "); 3 var temp=0; 4 for(i=0;i<arr.length;i++){ 5 var str1=arr[i]; 6 temp=temp>str1.length?temp:str1.length; 7 } 8 return temp; 9 } 10 11 findLongestWord("The quick brown fox jumped over the lazy dog");
确保字符串的每个单词首字母都大写,其余部分小写。
像'the'和'of'这样的连接符同理。
1 function titleCase(str) { 2 var arr=str.split(" "); 3 var str1=""; 4 //遍历数组 5 for(i=0;i<arr.length;i++){ 6 //把每段字符串第一个字母大写 7 var strTemp=arr[i]; 8 var strTiQu1=strTemp.slice(0,1); 9 strTiQu1=strTiQu1.toUpperCase(); 10 var strTiQu2=strTemp.slice(1); 11 strTiQu2=strTiQu2.toLowerCase(); 12 arr[i]=strTiQu1+strTiQu2; 13 } 14 for(i=0;i<arr.length-1;i++){ 15 str1+=arr[i]+" "; 16 } 17 var i=arr.length; 18 str1+=arr[i-1]; 19 return str1; 20 } 21 22 titleCase("I'm a little tea pot");
右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组。
提示:你可以用for循环来迭代数组,并通过arr[i]的方式来访问数组的每个元素。
1 function largestOfFour(arr) { 2 // You can do this! 3 for(var i=0;i<arr.length;i++){ 4 arr[i]=maxOfArr(arr[i]); 5 } 6 return arr; 7 } 8 //计算单个数组最大值 9 function maxOfArr(arr) { 10 var max=arr[0]; 11 for(var i=1;i<arr.length;i++){ 12 max=max>arr[i]?max:arr[i]; 13 } 14 return max; 15 } 16 17 largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
检查一个字符串(str)是否以指定的字符串(target)结尾。
如果是,返回true;如果不是,返回false。
1 function confirmEnding(str, target) { 2 // "Never give up and good luck will find you." 3 // -- Falcor 4 //声明两个数组用于存储 5 var arr1=[],arr2=[]; 6 //用for循环存储字符 7 var i; 8 for(i=0;i<str.length;i++){ 9 arr1[i]=str[i]; 10 } 11 for(i=0;i<target.length;i++){ 12 arr2[i]=target[i]; 13 } 14 //采用while循环倒序比较 15 var j=arr1.length-1; 16 i=arr2.length-1; 17 while(i>=0){ 18 if(arr2[i]==arr1[j]){ 19 i--; 20 j--; 21 } 22 else{ 23 str=false; 24 break; 25 } 26 str=true; 27 } 28 29 return str; 30 } 31 32 confirmEnding("Bastian", "n");
重要的事情说3遍!
重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串。
1 function repeat(str, num) { 2 // repeat after me 3 if(num<=0){ 4 str=""; 5 } 6 else{ 7 var newstr=""; 8 for(i=0;i<num;i++){ 9 newstr+= str; 10 } 11 str=newstr; 12 } 13 14 return str; 15 } 16 17 repeat("abc", 3);
截断一个字符串!
如果字符串的长度比指定的参数num长,则把多余的部分用...来表示。
切记,插入到字符串尾部的三个点号也会计入字符串的长度。
但是,如果指定的参数num小于或等于3,则添加的三个点号不会计入字符串的长度。
1 function truncate(str, num) { 2 // Clear out that junk in your trunk 3 var arr=[]; 4 for(var i=0;i<str.length;i++){ 5 arr[i]=str[i]; 6 } 7 //字符串的长度比指定的参数num短 8 //直接输出 9 if(str.length<=num){ 10 return str; 11 } 12 //否则以下代码 13 var last="..."; 14 str=""; 15 if(num<=3){ 16 for(j=0;j<num;j++){ 17 str+=arr[j]; 18 } 19 str+=last; 20 console.log(str); 21 } 22 else{ 23 for(j=0;j<num-last.length;j++){ 24 str+=arr[j]; 25 } 26 str+=last; 27 console.log(str); 28 } 29 30 31 return str; 32 } 33 34 truncate("A-tisket a-tasket A green and yellow basket", 11);
把一个数组arr按照指定的数组大小size分割成若干个数组块。
例如:chunk([1,2,3,4],2)=[[1,2],[3,4]];
chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]];
1 function chunk(arr, size) { 2 // Break it up. 3 var arrSave=[]; 4 var lengther=parseInt(arr.length/size); 5 //var bl=arr.length/size>lengther?true:false; 6 for(i=0;i<lengther;i++){ 7 arrSave[i]=element(arr,size); 8 //print(arrSave); 9 } 10 if(arr.length!==0){ 11 //此处判断条件不知道怎么写 12 //可以用length判断 13 arrSave.push(arr); 14 } 15 return arrSave; 16 } 17 18 //此函数用于返回分割后的每一个数组 19 function element(arr,size){ 20 var newarr = []; 21 for(j = 0;j < size;j++){ 22 //print("j="+j); 23 newarr[j]=arr[0]; 24 arr.shift(arr[0]); 25 //print(newarr); 26 } 27 return newarr; 28 } 29 30 chunk(["a", "b", "c", "d"], 2);
学姐提供的参考代码
1 function chunk(arr,size){ 2 var subArrLength=Math.ceil((arr.length)/size);//里面数组的个数 3 var newArr=[]; 4 for(var i=0;i<subArrLength;i++){ 5 var subArr=[]; 6 for(var j=0;j<size;j++){ 7 subArr.push(arr.shift()); 8 if(arr.length===0){ 9 break; 10 } 11 } 12 newArr.push(subArr); 13 } 14 return newArr; 15 } 16 var arr=[1,2,3,4,5]; 17 console.log(chunk(arr,2));
返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始。
1 function slasher(arr, howMany) { 2 // it doesn't always pay to be first 3 if(howMany>=arr.length){ 4 arr=[]; 5 } 6 else{ 7 var newArr=[],j=0; 8 for(var i=howMany;i<arr.length;i++){ 9 newArr[j]=arr[i]; 10 j++; 11 } 12 arr=newArr; 13 } 14 return arr; 15 } 16 17 slasher([1, 2, 3], 2);
如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。
举例,["hello", "Hello"]应该返回true,因为在忽略大小写的情况下,第二个字符串的所有字符都可以在第一个字符串找到。
["hello", "hey"]应该返回false,因为字符串"hello"并不包含字符"y"。
["Alien", "line"]应该返回true,因为"line"中所有字符都可以在"Alien"找到。
1 function mutation(arr) { 2 //用两个字符串存储,并全都转换成小写 3 var str1=arr[0], 4 str2=arr[1]; 5 str1=str1.toLowerCase(); 6 str2=str2.toLowerCase(); 7 //print(str1+" ; "+str2); 8 //用于返回的布尔值 9 var bl=true; 10 //循环遍历 11 var i,j; 12 for(i=0;i<str2.length;i++){ 13 for(j=0;j<str1.length;j++){ 14 if(str2[i]===str1[j]){ 15 //print(str2[i]+" * "+str1[j]) 16 break; 17 } 18 if(j===str1.length-1){ 19 bl=false; 20 } 21 } 22 } 23 return bl; 24 } 25 26 mutation(["hello", "hey"]);

浙公网安备 33010602011771号