freeCodeCamp 初级javascript算法体验

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

翻转字符串
先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串。
你的结果必须得是一个字符串
对你有帮助的资源:
Global String Object String对象的了解
String.split() 将一个String对象分割成字符串数组
Array.reverse() 将数组中元素的位置颠倒。第一个数组元素成为最后一个数组元素,最后一个数组元素成为第一个。
Array.join() 将数组(或一个类数组对象的所有元素连接到一个字符串中。

//思路:注意有的方法是针对字符串有的是针对数组,所以字符串和数组之间的转换很重要!   
//hello--split-->["h", "e", "l", "l", "o"]--reverse-->["o", "l", "l", "e", "h"]--join-->olleh
function reverseString(str) {
  str = str.split("").reverse().join("");
  return str;
}
reverseString("hello");
2、计算一个整数的阶乘(Factorialize a Number)

计算一个整数的阶乘
如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积。
阶乘通常简写成n!
例如:5! = 1 * 2 * 3 * 4 * 5 = 120
对你有帮助的资源:
Arithmetic Operators 算术运算符以数值(字面量或变量)作为其操作数,并返回一个单个数值。标准算术运算符是加法(+),减法( - ),乘法(*)和除法(/)。

//思路1:将要计算的数值从1开始递加,是有数值相乘即可
function factorialize(num) {
  var result = 1;
  for(var i = 1;i<=num;i++){
    result = result * i;
  }
  return result;
}
factorialize(5);
//思路2:也可以用递归的思想,每次乘以比自己小1的数字
function factorialize(num) {
  // 请把你的代码写在这里
  if(num>0){
    return (num * factorialize(num-1));
  }else
    return 1;
}
factorialize(5);
3、检查回文字符串(Check for Palindromes)

检查回文字符串
如果给定的字符串是回文,返回true,反之,返回false。
如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。
注意你需要去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文。
函数参数的值可以为"racecar","RaceCar"和"race CAR"。
对你有帮助的资源:
String.replace() 方法返回一个由替换值替换一些或所有匹配的模式后的新字符串。模式可以是一个字符串或者一个正则表达式, 替换值可以是一个字符串或者一个每次匹配都要调用的函数。
String.toLowerCase() 会将调用该方法的字符串值转为小写形式,并返回。

//思路:先去掉字符串多余的标点符号和空格,然后把字符串转化成小写,如果字符串和翻转之后的字符串相等,则是回文
function palindrome(str) {
   str = str.toLowerCase().replace(/[\W\s_]/g, '');  //正则表达式:\w查找单词字符,\W查找非单词字符,\s查找空白字符,\S查找非空白字符
  return str === str.split("").reverse().join("");
}
palindrome("eye");
4、找出最长单词(Find the Longest Word in a String)

找出最长单词
在句子中找出最长的单词,并返回它的长度。
函数的返回值应该是一个数字。
对你有帮助的资源:
String.length 获取一个字符串的长度

//思路:先将句子分割成一个一个的字符串存在数组里,循环比较每个字符串的大小,将最大值赋值gwinnett临时变量length
function findLongestWord(str) {
  var result = str.split(" ");
  var length = result[0].length;  //临时变量,存放其中一个字符串的长度
  for(var i = 0 ;i<result.length;i++){
    if(result[i].length>length){
      length = result[i].length;
    }
  }
  return length;
}
findLongestWord("The quick brown fox jumped over the lazy dog");
5、句中单词首字母大写(Title Case a Sentence)

句中单词首字母大写
确保字符串的每个单词首字母都大写,其余部分小写。
对你有帮助的资源:
String.slice() 提取一个字符串的一部分并返回一个新字符串

//思路:将所有的字符串小写之后分割成单独的字符串存放在数组里,循环数组将每一个字符串的首字母分割出来并大写和其余的字符串合并起来形成新的字符串,最后将数组中的所有字符串连接成一个新的字符串
function titleCase(str) {
  var result = str.toLowerCase().split(" ");
  for(var i =0;i<result.length;i++){
    result[i] = result[i].slice(0,1).toUpperCase()+result[i].slice(1);
  }
  return result.join(' ');
}
titleCase("I'm a little tea pot");
6、找出多个数组中的最大数(Return Largest Numbers in Arrays)

找出多个数组中的最大数
右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组。
提示:你可以用for循环来迭代数组,并通过arr[i]的方式来访问数组的每个元素。

//思路:通过二次循环,比较出每一组数组的最大值,存放到新的数组中
function largestOfFour(arr) {
  var newArr= [];  //存放新数组
  var temp;  //存放临时最大值
  for(var i = 0;i<arr.length;i++){
    temp=arr[i][0];
    for(var j = 0;j<arr[i].length;j++){
      if(arr[i][j]>temp){
        temp = arr[i][j];
      }
      newArr[i]=temp;
    }
  }
  return newArr;
}
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
7、检查字符串结尾(Confirm the Ending)

检查字符串结尾
判断一个字符串(str)是否以指定的字符串(target)结尾。
如果是,返回true;如果不是,返回false。
对你有帮助的资源:
String.substr() 方法返回一个字符串中从指定位置开始到指定字符数的字符。

//思路:从target前面的字符位置(字符长度-target长度)开始截取,看截取出来的字符跟target一不一样
function confirmEnding(str, target) {
  return str.substr(str.length-target.length) == target;
}
confirmEnding("Bastian", "n");
8、重复输出字符串(Repeat a string repeat a string)

重复输出字符串
重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串。

//思路:循环要输出的次数,将字符串连接起来即可
function repeat(str, num) {
  var temp = "";
  for(var i = 0 ; i < num ; i ++){
    temp+=str;
  }
  return temp;
}
repeat("abc", 3);
9、截断字符串(Truncate a string)

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

//思路:分成小于等于3和大于3的两种情况,然后用slice切断字符最后加上‘...’
function truncate(str, num) {
  if(num <= 3){
    str = str.slice(0,num)+'...';
  }else if(str.length > num){
    str = str.slice(0,num-3)+'...';
  }
  return str;
}
truncate("A-tisket a-tasket A green and yellow basket", 11);
10、猴子吃香蕉, 分割数组(Chunky Monkey)

猴子吃香蕉, 分割数组
(猴子吃香蕉可是掰成好几段来吃哦)
把一个数组arr按照指定的数组大小size分割成若干个数组块。
例如:chunk([1,2,3,4],2)=[[1,2],[3,4]];
chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]];
对你有帮助的资源:
Array.push() 方法将一个或多个元素添加到数组的末尾,并返回数组的新长度。

//思路:先按照size确定分成几组,如果有多余的组数+1,然后确定分割的开始和结束位置,将分割出来的数组存放到新的数组中
function chunk(arr, size) {
  var len = parseInt(arr.length/size);  //分组
  var remain = arr.length%size;   //取模,看是否有多余的数组
  var a = [];  //存放最后的数组
  var sot = remain > 0?len+1:len;
  for(var i = 1;i<=sot;i++){
    var start = size * (i - 1);    //确定开始和结束位置
    var end = (i>len)?(i-1)*size+remain:i*size;
    var mylocates = arr.slice(start,end);   // 分割数组
    a.push(mylocates);   //存放到新的数组中
  }
  return a;
}
chunk(["a", "b", "c", "d"], 2);
11、截断数组(Slasher Flick)

截断数组
返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始。
对你有帮助的资源:
Array.splice() 方法通过删除现有元素和/或添加新元素来更改一个数组的内容。

//思路:用splice函数,从0开始截断howmany个长度,返回截断之后的字符串
function slasher(arr, howMany) {
  arr.splice(0,howMany);
  return arr;
}
slasher([1, 2, 3], 2);
12、比较字符串(Mutations)

比较字符串
如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。
举例,["hello", "Hello"]
应该返回true,因为在忽略大小写的情况下,第二个字符串的所有字符都可以在第一个字符串找到。
["hello", "hey"]应该返回false,因为字符串"hello"并不包含字符"y"。
["Alien", "line"]应该返回true,因为"line"中所有字符都可以在"Alien"找到。
对你有帮助的资源:
String.indexOf() 方法返回调用String对象中第一次出现的指定值的索引,开始在 fromIndex进行搜索。如果未找到该值,则返回-1。
String.charAt() 方法从一个字符串中返回指定的字符。

//思路:在第一个字符串里面循环查找第二个字符串中的每一个字符,有一个就没有false
function mutation(arr) {
  for(var i =0;i<arr[1].length;i++){
    if(arr[0].toUpperCase().indexOf(arr[1].charAt(i).toUpperCase())==-1)  return false;   
  }
  return true;
}
mutation(["hello", "hey"]);

13、过滤数组假值(Falsy Bouncer)

过滤数组假值
删除数组中的所有假值。
在JavaScript中,假值有false、null、0、""、undefined和NaN。
对你有帮助的资源:
Boolean Objects 对象是一个布尔值的对象包装器。
Array.filter() 为数组中的每个元素调用一次 callback函数,并利用所有使得 callback返回 true 或等价于 true 的值的元素创建一个新数组。

//思路:新建一个callback函数,检测元素是否是假元素,不是假元素则返回元素,用callback函数过滤需要检查的数组,返回过滤剩下的元素
function bouncer(arr) {
  function isBigEnough(element){
    if(element!==false || element!==null || element!==0 || element!=="" || element!==undefined || element!==NaN){
      return element;
    }
  }
  var filtered = arr.filter(isBigEnough);    //过滤函数
  return filtered;
}
bouncer([7, "ate", "", false, 9]);
14、摧毁数组(Seek and Destroy)

摧毁数组
金克斯的迫击炮!
实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值。
对你有帮助的资源:
Arguments object 是一个类似数组的对象, 对应于传递给函数的参数。是隐藏的参数。

//思路:将要删除的元素存放到一个数组中,用filter函数过滤掉要删除的元素(用indexOf方法)
function destroyer(arr) {
  var args = [];  //存放要删除的元素
  for(var i =1;i<arguments.length;i++){
    args.push(arguments[i]);  //将隐藏的参数(待删除的值)存放到一个数组中,除去第一个数组值,所以从1开始存放
  }
  var temp = arr.filter(function(item,index,array){
    return args.indexOf(item) < 0;
  });  //用filter函数,返回数组中未找到item的值,即不用删除的值
  return temp;
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
15、数组排序并找出元素索引(Where do I belong)

数组排序并找出元素索引
举例: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。

//思路:将num值跟数组中的值循环进行对比,r记录num是第几位排序
function where(arr, num) {
  var len = arr.length;
  var r = 0;
  for(var i =0;i<len;i++){
    if(num > arr[i]){
      r++;
    }
  }
  return r;
}
where([40, 60], 50);
16、凯撒密码(Caesars Cipher)

凯撒密码
下面我们来介绍风靡全球的凯撒密码Caesar cipher,又叫移位密码。
移位密码也就是密码中的字母会按照指定的数量来做移位。
一个常见的案例就是ROT13密码,字母会移位13个位置。由'A' ↔ 'N', 'B' ↔ 'O',以此类推。
写一个ROT13函数,实现输入加密字符串,输出解密字符串。
所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,跳过它们。
对你有帮助的资源:
String.charCodeAt() 方法返回0到65535之间的整数,表示给定索引处的UTF-16代码单元 (在 Unicode 编码单元表示一个单一的 UTF-16 编码单元的情况下,UTF-16 编码单元匹配 Unicode 编码单元。但在——例如 Unicode 编码单元 > 0x10000 的这种——不能被一个 UTF-16 编码单元单独表示的情况下,只能匹配 Unicode 代理对的第一个编码单元) 。如果你想要整个代码点的值,使用 codePointAt()。
String.fromCharCode() 方法返回使用指定的Unicode值序列创建的字符串。

//思路:unicode编码范围:大写字母[65,90],小写字母[97,122]
function rot13(str) { 
  var str1 = [];
  for(var i =0;i<str.length;i++){
    var num = str[i].charCodeAt();    //返回字母的编码
    if(num>=65&&num<=77)  //前13个大写字母
      num = num+13;
    else if(num>77&&num<91)  //后13个大写字母
      num = num - 13;
    str1.push(String.fromCharCode(num));  //接收指定的unicode值,返回一个字符串
  }
  return str1.join("");
}
rot13("GUR DHVPX OEBJA QBT WHZCRQ BIRE GUR YNML SBK."); 
写在最后的注意点:
  • indexOf的‘o‘一定要大写,我已经掉坑两次,检查了好久不知道错在哪里
  • slice()方法 和splice 方法的区别。。。
  • 区别有些方式是string方法,有些是array方法,所以要会string和array之间的灵活转换
  • 熟练运行各种截取string字符串的方法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,219评论 0 4
  • 网友问: 老显先生,您好,您可以告诉我在现在这个时代我们相亲也好,朋友介绍也好,我们到底应该以什么为标准? 我也见...
    老显阅读 620评论 0 0
  • 为了让孩子养成每天晚上9点钟睡觉的习惯,我规定到了九点钟,家里面所有的灯都关掉。 7点钟我还没有下班,打了孩子的电...
    牧田麻麻阅读 217评论 0 0
  • 毕业将至,书本太多太重,没办法搬回家。有些书或许未来会有大用,虽然搬不走,但能记录下来,以后在网上再买。 大学物理...
    Manegga阅读 153评论 0 0