资讯专栏INFORMATION COLUMN

16 道 JavaScript 基础算法 - freeCodeCamp

yintaolaowanzi / 2985人阅读

#1. Reverse a String

Reverse the provided string.

You may need to turn the string into an array before you can reverse it.

Your result must be a string.

function reverseString(str/*:string*/) {
  if (str.length <= 1) return str;
  let result = "";
  for (let i = str.length - 1; i >= 0; i--) {
    result += str.charAt(i);
  }
  return result;
}

reverseString("hello");
#2. Factorialize a Number

Return the factorial of the provided integer.

If the integer is represented with the letter n, a factorial is the product of all positive integers less than or equal to n.

Factorials are often represented with the shorthand notation n!.

For example: 5! = 1 * 2 * 3 * 4 * 5 = 120.

function factorialize(num/*:number*/) {
  if (num === 0) return 1;
  let result = num;
  while (--num > 0) {
    result *= num;
  }
  return result;
}

factorialize(5);
#3. Check for Palindromes

Return true if the given string is a palindrome. Otherwise, return false.

A palindrome is a word or sentence that"s spelled the same way both forward and backward, ignoring punctuation, case, and spacing.

Note

You"ll need to remove all non-alphanumeric characters (punctuation, spaces and symbols) and turn everything lower case in order to check for palindromes.
We"ll pass strings with varying formats, such as "racecar", "RaceCar", and "race CAR" among others.
We"ll also pass strings with special symbols, such as "2A3*3a2", "2A3 3a2", and "2_A3*3#A2".

function palindrome(str/*:string*/) {
  const lstr = str.toLowerCase();
  let low = 0, high = lstr.length - 1;
  const reg = /[^0-9a-z]/;
  while (low < high) {
    const lchar = lstr.charAt(low);
    if (reg.test(lchar)) {
      low++;
      continue;
    }
    const hchar = lstr.charAt(high);
    if (reg.test(hchar)) {
      high--;
      continue;
    }
    if (lchar !== hchar) return false;
    low++;
    high--;
  }
  return true;
}

palindrome("eye");
#4. Find the Longest Word in a String

Return the length of the longest word in the provided sentence.

Your response should be a number.

function findLongestWord(str/*:string*/) {
  let max = 0, len = 0;
  for (let i = 0; i < str.length; i++) {
    if (str.charAt(i) === " ") {
      if (len > max) max = len;
      len = 0;
    } else len++;
  }
  return Math.max(max, len);
}

findLongestWord("The quick brown fox jumped over the lazy dog");
#5. Title Case a Sentence

Return the provided string with the first letter of each word capitalized. Make sure the rest of the word is in lower case.

For the purpose of this exercise, you should also capitalize connecting words like "the" and "of".

function titleCase(str/*:string*/) {
  let result = "", len = 0;
  for (let i = 0; i < str.length; i++) {
    if (str.charAt(i) === " ") {
      if (len === 0) result += " ";
      else {
        result += str.charAt(i - len).toUpperCase()
          + str.substr(i - len + 1, len).toLowerCase();
        len = 0;
      }
    } else len++;
  }
  if (len === 0) return result;
  return result + str.charAt(len = str.length - len).toUpperCase()
    + str.substr(len + 1).toLowerCase();
}

titleCase("I"m a little tea pot");
#6. Return Largest Numbers in Arrays

Return an array consisting of the largest number from each provided sub-array. For simplicity, the provided array will contain exactly 4 sub-arrays.

Remember, you can iterate through an array with a simple for loop, and access each member with array syntax arr[i].

function largestOfFour(arrs/*:number[][]*/) {
  const results = [];
  for (const arr of arrs) {
    results.push(arr.reduce((max, current) => Math.max(max, current)));
  }
  return results;
}

largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
#7. Confirm the Ending

Check if a string (first argument, str) ends with the given target string (second argument, target).

This challenge can be solved with the .endsWith() method, which was introduced in ES2015. But for the purpose of this challenge, we would like you to use one of the JavaScript substring methods instead.

function confirmEnding(str/*:string*/, tar/*:string*/) {
  const delta = str.length - tar.length;
  if (delta < 0) return false;
  for (let i = tar.length; i >= 0; i--) {
    if (str.charAt(i + delta) !== tar.charAt(i)) return false;
  }
  return true;
}

confirmEnding("Bastian", "n");
#8. Repeat a string

Repeat a given string (first argument) num times (second argument). Return an empty string if num is not a positive number.

function repeatStringNumTimes(str/*:string*/, num/*:number*/) {
  if (num <= 0) return "";
  if (num === 1) return str;
  if (num % 2) return str
    + repeatStringNumTimes(str, num - 1);
  str = repeatStringNumTimes(str, num >> 1);
  return str + str;
}

repeatStringNumTimes("abc", 3);
#9. Truncate a string

Truncate a string (first argument) if it is longer than the given maximum string length (second argument). Return the truncated string with a ... ending.

Note that inserting the three dots to the end will add to the string length.

However, if the given maximum string length num is less than or equal to 3, then the addition of the three dots does not add to the string length in determining the truncated string.

function truncateString(str/*:string*/, num/*:number*/) {
  if (str.length <= num) return str;
  if (num > 3) return str.substr(0, num - 3) + "...";
  return str.substr(0, num) + "...";
}

truncateString("A-tisket a-tasket A green and yellow basket", 11);
#10. Chunky Monkey

Write a function that splits an array (first argument) into groups the length of size (second argument) and returns them as a two-dimensional array.

function chunkArrayInGroups(arr/*:any[]*/, size/*:number*/) {
  const results = [];
  let start = 0;
  while (start < arr.length) {
    results.push(arr.slice(start, start = start + size));
  }
  return results;
}

chunkArrayInGroups(["a", "b", "c", "d"], 2);
#11. Slasher Flick

Return the remaining elements of an array after chopping off n elements from the head.

The head means the beginning of the array, or the zeroth index.

function slasher(arr/*:any[]*/, howMany/*:number*/) {
  return arr.slice(howMany);
}

slasher([1, 2, 3], 2);
#12. Mutations

Return true if the string in the first element of the array contains all of the letters of the string in the second element of the array.

For example, ["hello", "Hello"], should return true because all of the letters in the second string are present in the first, ignoring case.

The arguments ["hello", "hey"] should return false because the string "hello" does not contain a "y".

Lastly, ["Alien", "line"], should return true because all of the letters in "line" are present in "Alien".

function mutation(arr/*:any[]*/) {
  const str = arr[0].toLowerCase();
  const tar = arr[1].toLowerCase();
  for (let i = tar.length - 1; i >= 0; i--) {
    if (str.indexOf(tar.charAt(i)) < 0) return false;
  }
  return true;
}

mutation(["hello", "hey"]);
#13. Falsy Bouncer

Remove all falsy values from an array.

Falsy values in JavaScript are false, null, 0, "", undefined, and NaN.

function bouncer(arr/*:any[]*/) {
  return arr.filter((item) => item);
}

bouncer([7, "ate", "", false, 9]);
#14. Seek and Destroy

You will be provided with an initial array (the first argument in the destroyer function), followed by one or more arguments. Remove all elements from the initial array that are of the same value as these arguments.

function destroyer(arr/*:any[]*/, ...rest/*:any[]*/) {
  return arr.filter((item) => rest.indexOf(item) < 0);
}

destroyer([1, 2, 3, 1, 2, 3], 2, 3);
#15. Where do I belong

Return the lowest index at which a value (second argument) should be inserted into an array (first argument) once it has been sorted. The returned value should be a number.

For example, getIndexToIns([1,2,3,4], 1.5) should return 1 because it is greater than 1 (index 0), but less than 2 (index 1).

Likewise, getIndexToIns([20,3,5], 19) should return 2 because once the array has been sorted it will look like [3,5,20] and 19 is less than 20 (index 2) and greater than 5 (index 1).

function getIndexToIns(arr/*:any[]*/, num/*:number*/) {
  return arr.reduce((index, current) => num > current ? index + 1 : index, 0);
}

getIndexToIns([40, 60], 50);
#16. Caesars Cipher

One of the simplest and most widely known ciphers is a Caesar cipher, also known as a shift cipher. In a shift cipher the meanings of the letters are shifted by some set amount.

A common modern use is the ROT13 cipher, where the values of the letters are shifted by 13 places. Thus "A" ↔ "N", "B" ↔ "O" and so on.

Write a function which takes a ROT13 encoded string as input and returns a decoded string.

All letters will be uppercase. Do not transform any non-alphabetic character (i.e. spaces, punctuation), but do pass them on.

function rot13(str/*:string*/) {
  const key = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  let decode = "";
  for (let i = 0; i < str.length; i++) {
    const index = key.indexOf(str.charAt(i));
    if (index < 0) decode += str.charAt(i);
    else decode += key.charAt((index + 13) % 26);
  }
  return decode;
}

rot13("SERR PBQR PNZC");

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89400.html

相关文章

  • 求职准备 - 收藏集 - 掘金

    摘要:一基础接口的意义百度规范扩展回调抽象类的意义想不想通过一线互联网公司面试文档整理为电子书掘金简介谷歌求职记我花了八个月准备谷歌面试掘金原文链接翻译者 【面试宝典】从对象深入分析 Java 中实例变量和类变量的区别 - 掘金原创文章,转载请务必保留原出处为:http://www.54tianzhisheng.cn/... , 欢迎访问我的站点,阅读更多有深度的文章。 实例变量 和 类变量...

    cuieney 评论0 收藏0
  • 2017-08-16 前端日报

    摘要:前端日报精选理解的专题之偏函数译理解事件驱动机制游戏开发前端面试中的常见的算法问题发布中文前端页面传参尚妆产品技术刊读基础系列二之实现大转盘抽奖掘金指南众成翻译编程插入排序众成翻译源码讲解函数技术风暴初体验个人文 2017-08-16 前端日报 精选 理解 JavaScript 的 async/awaitJavaScript专题之偏函数[译]理解 Node.js 事件驱动机制Pokem...

    graf 评论0 收藏0
  • FreeCodeCamp基础算法题答案解析

    摘要:总结下基础算法题先把字符串转化成数组,再借助数组的方法翻转数组顺序,最后把数组转化成字符串。检查一个字符串是否以指定的字符串结尾。删除数组中的所有假值。加密算法的核心是前个字母值加,后个字母值减从字母表重新回滚。 总结下FreeCodeCamp基础算法题: Reverse a String 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串。 fu...

    sihai 评论0 收藏0
  • 16初级脚本算法,你要挑战一下吗?

    摘要:设置首字母大写算法挑战返回一个字符串确保字符串的每个单词首字母都大写,其余部分小写。确认末尾字符算法检查一个字符串是否以指定的字符串结尾。删除数组中特定值算法挑战删除数组中的所有的假值。 在w3cschool上看到了这些初级算法题目,自己先尝试做了一下,不会的也会查看一下别人的借鉴一下思路,更多的帮助自己熟悉字符串和数组方法的应用.如果您有更好的解法,可以指出来还有中级算法题目和后面的...

    kumfo 评论0 收藏0
  • 在线编程练习实践网站

    摘要:在此收集一些自己遇到的一些在线练习的网站,当然大部分是。建议边学习边编程,学习编程是不能光看不实践的。国外的一个练习网站,有,也有,每种语言都有自己的道场,每个用户都有不同的等级,刷题提高等级,也可以插卡别人优秀的解决方案。 在学习的过程中会发现很多知识点如果不在工作中运用或者手写带验证的话,很容易忘记。任何技能的掌握都是需要不断练习的。在此收集一些自己遇到的一些在线练习的网站,当然大...

    huhud 评论0 收藏0

发表评论

0条评论

yintaolaowanzi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<