整理下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));
Code

 

 

返回一个数组被截断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"]);

 

posted @ 2017-04-24 07:40  Yao_xi  阅读(702)  评论(0)    收藏  举报