Javascript 学习笔记—初级算法
发布于 7 年前 作者 gaofei1974 3404 次浏览 来自 分享

一、翻转字符串 ( Reverse a String )

例子:reverseString(“hello”) //返回 “olleh”

代码

//递归算法
function reverseString(str) {
  return str.length ? reverseString(str.substr(1))+str.charAt(0) : "";
}
reverseString("hello");

二、阶乘 ( Factorialize a Number )

例子: 5! = 1 * 2 * 3 * 4 * 5 = 120

代码

//递归算法
function factorialize(num) {
  return num !== 0 ? num * factorialize(num-1) : 1;
}
/*
//for循环
function factorialize(num) {
  var result = 1;
  for (var i=2; i<=num; i++) {
    result *= i;
  }
  return result;
}
*/
factorialize(5);

三、检查回文字符串 ( Check for Palindromes )

如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。 例子:palindrome(“race car”) //返回 true.

代码

function palindrome(str) {
  str = str.replace(/[\W_]/g, "").toLowerCase();
  return str.split("").reverse().join("") === str;  
}
/*
// for 循环
function palindrome(str) {
  str = str.replace(/[\W_]/g,"").toLowerCase();
  var stop = str.length-1;
  for (var i=0; i<stop/2; i++) {
    if (str.charAt(i) !== str.charAt(stop-i)) return false;
  }
  return true;   
}
//递归算法
function palindrome(str) {
  str = str.replace(/[\W_]/g,"").toLowerCase();
  if (str.length<2) return true;
  if (str[0]===str[str.length-1]) return palindrome(str.slice(1,str.length-1));
  return false;
}
*/
palindrome("eye");

四、找出最长单词 ( Find the Longest Word in a String )

在句子中找出最长的单词,并返回它的长度。 例子: findLongestWord(“The quick brown fox jumped over the lazy dog”) //返回 6

代码

function findLongestWord(str) {
  return str.split(' ').reduce(function(acc, curr) {
    return Math.max(acc, curr.length);
  }, 0);
}
findLongestWord("The quick brown fox jumped over the lazy dog");

五、句中单词首字母大写 ( Title Case a Sentence )

确保字符串的每个单词首字母都大写,其余部分小写。 例子: titleCase(“I’m a little tea pot”) //返回 “I’m A Little Tea Pot”. ####代码

function titleCase(str) {
  return str.split(' ').map(function(val){
    return val.charAt(0).toUpperCase() + val.substr(1).toLowerCase();
  }).join(' ');
  /*
  // replace+正则
   return str.replace(/\w\S*/g, function(word) {
    return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
  });
  */
}
titleCase("I'm a little tea pot");

六、找出多个数组中的最大数 ( Return Largest Numbers in Arrays )

例子: largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]) //返回 [27,5,39,1001]

代码

// 递归
const largestOfFour = arr => arr.length>0 ? [Math.max.apply(null, arr.shift())].concat(largestOfFour(arr)) : [];
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

七、检查字符串结尾 ( Confirm the Ending )

判断一个字符串(str)是否以指定的字符串(target)结尾。 例子: confirmEnding(“He has to give me a new name”, “name”) //返回 true

代码

function confirmEnding(str, target) {
  return str.substr(-target.length) === target;
}
confirmEnding("Bastian", "n");

八、重复输出字符串 ( Repeat a string repeat a string )

重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串。 例子: repeat("", 3) //返回 "**"

代码

// 递归
function repeat(str, num) {
  return num > 0 ? str + repeat(str, num-1) : "";   
}
repeat("abc", 3);

九、截断字符串 ( Truncate a string )

( 用瑞兹来截断对面的退路 ) 如果字符串的长度比指定的参数num长,则把多余的部分用…来表示。但是,如果指定的参数num小于或等于3,则添加的三个点号不会计入字符串的长度。 例子: truncate(“A-tisket a-tasket A green and yellow basket”, 11) //返回 “A-tisket…”

代码

function truncateString(str, num) {
  if (str.length > num) {
    if (num <= 3) str = str.substr(0,num);
    else str = str.substr(0,num-3);
    str += '...';
  }
  return str;
}
truncateString("Absolutely Longer", 2);

十、分割数组

把一个数组arr按照指定的数组大小size分割成若干个数组块。 例子: chunk([“a”, “b”, “c”, “d”], 2) //返回 [[“a”, “b”], [“c”, “d”]]

代码

function chunk(arr, size) {
  var result = [], i=0;
  while (i<arr.length) result.push(arr.slice(i,i+=size));
  return result;
}
chunk(["a", "b", "c", "d"], 2);

十一、截断数组

返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始。 例子: slasher([1, 2, 3], 2) //返回 [3]

代码

function slasher(arr, howMany) {   
  return arr.length < howMany ? [] : arr.slice(howMany);
}
slasher([1, 2, 3], 0);

十二、比较字符串 ( Mutations )

如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。 例子: mutation([“Mary”, “Army”]) //返回 true

代码

function mutation(arr) {
  var str0 = arr[0].toLowerCase();
  var str1 = arr[1].toLowerCase();
  return Array.prototype.every.call(str1,function(val){
    return str0.indexOf(val)>-1;
  });
}
mutation(["hello", "hey"]);

十三、过滤数组假值 ( Falsy Bouncer )

删除数组中的所有假值。在JavaScript中,假值有false、null、0、""、undefined 和 NaN。 例子: bouncer([7, “ate”, “”, false, 9]) //返回 [7, “ate”, 9]

代码

function bouncer(arr) {  
  return arr.filter(function(val){return val;});                    
}
bouncer([7, "ate", "", false, 9]);

十四、摧毁数组 ( Seek and Destroy )

金克斯的迫击炮! 实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值。 例子: destroyer([1, 2, 3, 1, 2, 3], 2, 3) //返回 [1, 1]

代码

function destroyer(arr) {
  var args = [];
  for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);
  return arr.filter(function(val) {
    return args.indexOf(val)===-1;
  });
}
/*
function destroyer(arr) {  
  // 转换数组
  var thisArg = Array.prototype.slice.apply(arguments);  
  thisArg.shift();
  return arr.filter(function(val) {       
    return thisArg.indexOf(val) === -1;   
  });
}
*/
destroyer(["tree", "hamburger", 53], "tree", 53);

十五、数组排序并找出元素索引 ( Where do I belong )

先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引。 例子: where([10, 20, 30, 40, 50], 35) //返回 3

代码

function where(arr, num) {  
  return arr.reduce(function(prev, curr){
    return curr<num ? prev+1 : prev;
  },0); 
  /*
  // 数组的 sort 函数的使用
  if (arr.indexOf(num) === -1) {
    arr.push(num);    
  }
  arr.sort(function(a, b){
    return a - b;
  });
  return arr.indexOf(num);
  */
}
where([40, 60], 50);

十六、凯撒密码 ( Caesars Cipher )

移位密码也就是密码中的字母会按照指定的数量来做移位。一个常见的案例就是ROT13密码,字母会移位13个位置。由’A’ ↔ ‘N’, ‘B’ ↔ ‘O’,以此类推。 例子: rot13(“SERR PBQR PNZC”) \解码为 “FREE CODE CAMP”

代码

function rot13(str) {
  var Acode = "A".charCodeAt(0);
  var Zcode = "Z".charCodeAt(0);
  var NUMLETTERS = Zcode-Acode+1;
  return str.replace(/[A-Z]/g,function(char){
    var cc = char.charCodeAt(0);
    if (cc>=Acode && cc<=Zcode) {
      cc += 13;
      if (cc>Zcode) cc-=NUMLETTERS;
    }
    return String.fromCharCode(cc);
  });
}
/*
function rot13(str) {
  return str.split("").map(function(char){
      var cc = char.charCodeAt(0);
      return (cc>64 && cc<91) ? String.fromCharCode(cc%26+65) : char;
  }).join("");
}
*/
// Change the inputs below to test
rot13("SERR PBQR PNZC");
回到顶部