codeCamp Basic Algorithm Scripting

Basic Algorithm Scripting

1010~1012

1 Reverse a String   *

function reverseString(str) {
  // 请把你的代码写在这里
  str = str.split("").reverse().join("");
  return str;
}

String.split()
Array.reverse()
Array.join()

2 Factorialize a Number  *

function factorialize(num) {
  // 请把你的代码写在这里
  var i;
  var result = 1;
  
  for(i = 1;i<=num;i++){
    result = result*i;
  }
  
  return result;
}

factorialize(5);

3 Check for Palindromes* ?

  1. 去掉字符串多余的标点符号和空格
  2. 然后把字符串转化成小写
  3. 验证此字符串是否为回文
function palindrome(str) {
  // 请把你的代码写在这里
  var strReplace = str.replace(/[\s|\ |\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?]+/g,"");
  strReplace = strReplace.toLowerCase();
  var strReverse = strReplace.split("").reverse().join("");
  if(strReplace === strReverse){
    return true;
  }else{
    return false;
  }
  
}

palindrome("eye");

str.replace(/[\s|\ |~|`|!|@|#|$|%|^|&|*|(|)|-|_|+|=|||\|[|]|{|}|;|:|"|’|,|<|.|>|/|?]+/g,"")
正则表达式:替换空格和多中标点符号

4 Find the Longest Word in a String*

  1. String convert to Array
  2. Find the max length in a array ( Other way to find max???)
function findLongestWord(str) {
  // 请把你的代码写在这里
  var array1 = str.split(" ");
  var numOfWords = array1.length;
  var maxWord;
  var maxWordLength = 0;
  for (var i = 0; i < array1.length; i++) {
  	//Find the max length in a array
  	if (maxWordLength < array1[i].length) {
  		maxWordLength = array1[i].length;
  		maxWord = array1[i];
  	}
  }
  return maxWordLength;
}

findLongestWord("The quick brown fox jumped over the lazy dog");

5 Title Case a Sentence * ?

  1. 把字符串切成单词组成的数组
  2. 遍历数组的每个成员
  • 每个成员的首字母直接换成大写:
function titleCase(str) {
  var array1 = str.split(' ');
  var i;
  for(i=0; i<array1.length; i++){
    var fristLetter = array1[i][0];
    array1[i][0] = array1[i][0].toUpperCase(); //这样不能改变字符串的改字符
  }
  str = array1.join(" ");
  return str;
}

改进后

参考:https://www.cnblogs.com/jiangxiaobo/p/6276879.html

function titleCase(str) {
  var array1 = str.toLowerCase().split(' ');
  var i;
  for(i=0; i<array1.length; i++){
  	array1[i] = array1[i].slice(0,1).toUpperCase()+ array1[i].slice(1); 
  }
  return array1.join(" ");
}

slice(start,end)
返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。
http://www.w3school.com.cn/jsref/jsref_slice_array.asp

  • 用replace( )替换
function titleCase(str) {
  var array1 = str.toLowerCase().split(' ');
  var i;
  for(i=0; i<array1.length; i++){
  	array1[i] = array1[i].replace(array1[i][0], array1[i][0].toUpperCase())
  }
  return array1.join(" ");
}

String.prototype.replace()
参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace

6 Return Largest Numbers in Arrays

function largestOfFour(arr) {
  // 请把你的代码写在这里
  var i,
  	  j,
  	  newArr=[0,0,0,0]; //输入的数组不是4维的怎么初始化??
  for(i=0; i<arr.length;i++){
    for(j=0;j<arr[i].length;j++){
      if (arr[i][j]>newArr[i]){
        newArr[i]=arr[i][j];
      }
    }
  }
  return newArr;
}

largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

最简单的想法,最朴实的求最大值的算法。
newArr=[0,0,0,0]; //输入的数组不是4维的怎么初始化??

7 Confirm the Ending

str.substr(start[, length])
返回一个字符串中从指定位置开始到指定字符数的字符。

function confirmEnding(str, target) {
  // 请把你的代码写在这里
  var len = target.length;
  if(str.substr(-len)==target){
      return true;
    }else{
      return false;
    } 
  
}
confirmEnding("Bastian", "n");

8 Repeat a string repeat a string

str.repeat(count)
count: [0, +∞) ,表示在新构造的字符串中重复了多少遍原字符串。
构造并返回一个新字符串,该字符串包含被连接在一起的指定数量的字符串的副本。

function repeat(str, num) {
  // 请把你的代码写在这里
  if (num<0){
    return '';
  }else{
    return str.repeat(num);
  }
  
}

repeat("abc", 3);

9 Truncate a string

str.slice(beginSlice[, endSlice])
提取一个字符串的一部分,并返回一新的字符串。
参数:

  • beginSlice : 从该索引(以 0 为基数)处开始提取原字符串中的字符。如果值为负数,会被当做 sourceLength + beginSlice 看待,这里的sourceLength 是字符串的长度 (例如, 如果beginSlice 是 -3 则看作是: sourceLength - 3)
  • endSlice : 可选。在该索引(以 0 为基数)处结束提取字符串。如果省略该参数,slice会一直提取到字符串末尾。如果该参数为负数,则被看作是 sourceLength + endSlice,这里的 sourceLength 就是字符串的长度(例如,如果 endSlice 是 -3,则是, sourceLength - 3)。

对比:str.substr(start[, length])

var str1 = 'The morning is upon us.';
var str2 = str1.slice(4, -2); // OUTPUT: morning is upon u

(这里有点绕)
如果字符串的长度比指定的参数num长,则把多余的部分用…来表示。
切记,插入到字符串尾部的三个点号也会计入字符串的长度。
但是,如果指定的参数num小于或等于3,则添加的三个点号不会计入字符串的长度。

function truncate(str, num) {
  // 请把你的代码写在这里
  var len = str.length;
  if (num>3){
    if(len>num){
      str = str.slice(0,-(len-num+3))+'...';      
    }
  }else{
    if(len>num){
      str = str.slice(0,-(len-num))+'...';      
    }
  }  
  return str;
}

truncate("A-tisket a-tasket A green and yellow basket", 11);

10 Chunky Monkey

push(element1, …, elementN) 将一个或多个元素添加到数组的末尾,并返回新数组的长度。
slice(begin, end) 返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。且原始数组不会被修改。

要求:把一个数组arr按照指定的数组大小size分割成若干个数组块。
分析:chunk(arr, size)

  1. 新数组:newArr
  2. 判断 nowLen = arr.length - i *size > size ?
  3. yes:将arr的前size个元素组成一个数组,并添加在newArr中。将arr的前size个元素组成一个数组,并添加在newArr中。newArr.push(slice(0,size-1))
  4. no:newArr.push(slice(i *size,nowLen-1))
function chunk(arr, size) {
  // 请把你的代码写在这里
  var newArr=[];
  var nowLen,i;
  
  for(i=0;i<arr.length/size;i++){
    nowLen = arr.length - i*size;
    if(nowLen>size){
      newArr.push(arr.slice(i*size,i*size+size));
    }else{
      newArr.push(arr.slice(i*size,i*size+nowLen));
    }
  }  
  return newArr;
}

chunk(["a", "b", "c", "d"], 2);

11 Slasher Flick

splice(start[, deleteCount[, item1[, item2[, …]]]]) 通过删除现有元素和/或添加新元素来更改一个数组的内容。

  • deleteCount 可选。整数,表示要移除的数组元素的个数。如果 deleteCount 是 0,则不移除元素。 这种情况下,至少应添加一个新元素。如果 deleteCount 大于start 之后的元素的总数,则从 start 后面的元素都将被删除(含第 start 位)。
    如果deleteCount被省略,则其相当于(arr.length - start)。
  • 返回值:
    由被删除的元素组成的一个数组。 如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。

splice() 方法与 slice() 方法的作用是不同的,splice() 方法会直接对数组进行修改。

function slasher(arr, howMany) {
  // 请把你的代码写在这里
  arr.splice(0,howMany);
  return arr;
}

slasher([1, 2, 3], 2);

12 Mutations 比较字符串

str.indexOf(searchValue[, fromIndex])
返回调用 String 对象中第一次出现的指定值的索引,开始在 fromIndex进行搜索。

题目:如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。
分析:mutation([“hello”, “hey”]),arr[1]字符串中的字符在arr[0]中是否都能找到。

  1. 遍历arr[1],flag=true,若arr[0].indexOf(arr[1][i])>0,继续1
  2. 若出现arr[0].indexOf(arr[1][i])<0,flag=false,退出。
function mutation(arr) {
  // 请把你的代码写在这里
  var i,flag=true;
  var str1 = arr[0].toLowerCase();
  var str2 = arr[1].toLowerCase();
  for(i=0;i<str2.length;i++){
  	var num = str1.indexOf(str2[i]);
    if(num>=0){
      continue;
    }else{
      flag=false;
      break;
    }
  }
  return flag;
}

mutation(["Mary", "Army"]);

13 Falsy Bouncer

new Boolean([value])

  • 如果第一个参数不是布尔值,则会将其转换为布尔值。
  • 如果省略该参数,或者其值为 0、-0、null、false、NaN、undefined、或者空字符串(""),则生成的 Boolean 对象的值为 false
  • 如果传入的参数是 DOM 对象 document.all,也会生成值为 false的 Boolean 对象。
  • 任何其他的值,包括值为 “false” 的字符串和任何对象,都会创建一个值为true的 Boolean 对象。

13 Falsy Bouncer

new Boolean([value])

  • 如果第一个参数不是布尔值,则会将其转换为布尔值。
  • 如果省略该参数,或者其值为 0、-0、null、false、NaN、undefined、或者空字符串(""),则生成的 Boolean 对象的值为 false
  • 如果传入的参数是 DOM 对象 document.all,也会生成值为 false的 Boolean 对象。
  • 任何其他的值,包括值为 “false” 的字符串和任何对象,都会创建一个值为true的 Boolean 对象。

arr.filter(callback(element[, index[, array]])[, thisArg])
MDN的文档里解释得太复杂了,直接看例子再看定义就比较清楚了。

  • filter 为数组中的每个元素调用一次 callback 函数,并利用所有使得 callback 返回** true 或 等价于 true **的值的元素创建一个新数组。callback 只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。
  • 那些没有通过 callback 测试的元素会被跳过,不会被包含在新数组中。
  • callback 被调用时传入三个参数:
  • 元素的值
  • 元素的索引
  • 被遍历的数组

如果为 filter 提供一个 thisArg 参数,则它会被作为callback 被调用时的 this 值。否则,callback 的 this 值在非严格模式下将是全局对象,严格模式下为 undefined。callback 最终观察到的this值是根据通常函数所看到的 "this"的规则确定的。
filter 不会改变原数组,它返回过滤后的新数组。

function bouncer(arr) {
  // 请把你的代码写在这里
  function ifFalse(arr){
    return Boolean(arr);
  }
  var newArr;
  newArr = arr.filter(ifFalse);
  return newArr;
}

bouncer([7, "ate", "", false, 9]);

14 Seek and Destroy ✨

arguments 是一个对应于传递给函数的参数类数组对象

题目:实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组arr1,其余的参数是待摧毁的值arr2。destroyer([1, 2, 3, 1, 2, 3], 2, 3);
分析:arr2的元素个数不一定,所以不能直接用arr1&&arr2[i],得遍历arr2。

function destroyer(arr) {
  // 请把你的代码写在这里
  var arr1 = arguments[0];
  var args = Array.prototype.slice.call(arguments);//将arguments转为真正的数组后,才能对它使用slice()方法
  var arr2 = args.slice(1);
  function ifDest(arr1){
    var i,ifEqual = true;
    for(i=0;i<arr2.length;i++){
      ifEqual = ifEqual && arr1 !== arr2[i];
    }    
    return ifEqual;
  }
  return arr1.filter(ifDest);
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);

15 Where do I belong

arr.sort([compareFunction])

  • 如果没有指明 compareFunction ,那么元素会按照转换为的字符串的诸个字符的Unicode位点进行排序。
  • 如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:
  • 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;
  • 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);
  • 如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。

compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

返回值:

  • 排序后的数组。请注意,数组已原地排序,并且不进行复制。
// a - b < 0 时,a小于b,a 会被排列到 b之前,即小的排前面,升序
arr.sort(function(a,b){
    return a-b;
  })
 
// b - a < 0 时,b小于a,a 会被排列到 b 之前,即大的排前面,降序
arr.sort(function(a,b){
    return b-a;
  })

题目:先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引。

function where(arr, num) {
  // 请把你的代码写在这里
  arr.sort(function(a,b){
    return a-b;
  });
  //遍历数组,当num<=arr[i]时,把num插入到arr[i]前面splice(i, 0, num)
  var i;
  for(i=0;i<arr.length+1;i++){
    if(num<=arr[i]){
      arr.splice(i, 0, num);
      return arr,i;
    }
    if(i==arr.length){
      arr.splice(i, 0, num);
      return arr,i;
    }
  }  
}

where([40, 60], 50);

16 Caesars Cipher?

String.fromCharCode(num1, …, numN)
由于 fromCharCode 是 String 的静态方法,所以应该像这样使用:String.fromCharCode(),而不是作为你创建的 String 对象的方法。
String.fromCharCode(65,66,67) // "ABC"
str.charCodeAt(index)
返回Unicode 值
"ABC".charCodeAt(0) // returns 65:"A"
"ABC".charCodeAt(1) // returns 66:"B"

题目:
在这里插入图片描述
分析:

  1. 返回str的Unicode值,[A-Z]=[65-77-78-90]分别+13/-13
  2. 转换为str
  3. String.fromCharCode(65,66,67) // “ABC”,里面不能放数组!!
  4. “ABC”.charCodeAt(0) // returns 65:“A”
  5. 跳过特殊字符
function rot13(str) { // LBH QVQ VG!
  var i;
  var rotNum=[]; //数组的初始化
  var strRot='';
  for(i=0;i<str.length;i++){
    
    if(str.charCodeAt(i)>=65 && str.charCodeAt(i)<=77){
      //如果是大写
      rotNum[i] = str.charCodeAt(i)+13;
    }else if(str.charCodeAt(i)>=78 && str.charCodeAt(i)<=90){
      rotNum[i] = str.charCodeAt(i)-13;
    }else{
      rotNum[i] = str.charCodeAt(i);
    }
    strRot = strRot + String.fromCharCode(rotNum[i]);
  }

  return strRot;
}

rot13("SERR PBQR PNZC");  // 你可以修改这一行来测试你的代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值