FCC上的javascript基础算法题

前一阵子做的基础算法题,感觉做完后收获还蛮大的,现在将自己的做法总结出来,供大家参考讨论。基本上做到尽量简短有效,但有些算法还可以继续简化,比如第七题若采用正则表达式来匹配,则一行代码就可以完成需求。欢迎大家提出不同解法。末尾有FCC的链接,感兴趣的同学可以去做一做。

1.翻转字符串
function reverseString(str) {
var arr=str.split("");
str=arr.reverse().join("");
return str;
}
reverseString("hello");
2.计算一个整数的阶乘
function factorialize(num) {
return (num<1) ? num = 1 : num*factorialize(num-1);
}
3.判断所给字符串是否是回文

如果给定的字符串是回文,返回true,反之,返回false。如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。

function palindrome(str) {
var p=/\s+|[,._():/\-]/gi;
var pstr=str.replace(p,"");
var arr=pstr.split("");
var restr=arr.reverse();
var newstr="";
for (var i=0; i<arr.length; i++){
newstr+=arr[i];
}
if(newstr.toLowerCase()==pstr.toLowerCase()){
return true;
}
return false;
}
palindrome("fye");
4. 找到提供的句子中最长的单词,并计算它的长度。
function findLongestWord(str) {
var wordArr=str.split(" ");
var wordLengthArr=[];
var num=0;
for (var i=0; i<wordArr.length; i++){
wordLengthArr.push(wordArr[i].length);
}
for (i=0; i<wordLengthArr.length; i++){
if(num<wordLengthArr[i]){
num=wordLengthArr[i];
}
}
return num;
}
findLongestWord("The quick brown fox jumped over the lazy dog");
5. 将所给字符串的每个单词首字母大写,其余部分小写。
function toFirstUpper(word){
return word.substring(0,1).toUpperCase()+word.substring(1).toLowerCase();
}
function titleCase(str) {
var wordArr=str.split(" ");
for (var i=0; i<wordArr.length; i++){
wordArr[i]=toFirstUpper(wordArr[i]);
}
str=wordArr.join(" ");
return str;
}
titleCase("I'm a little tea pot");
6.大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组。

如:[[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]] 应该返回 [27,5,39,1001]

function largestOfFour(arr) {
var newArr=[];
var index=0;
for (var i=0; i<arr.length; i++){
for (var j=0; j<arr[i].length; j++){
if(arr[i][index]<arr[i][j]){
index=j;
}
}
newArr.push(arr[i][index]);
}
return newArr;
}
7.检查一个字符串(str)是否以指定的字符串(target)结尾。如果是,返回true;如果不是,返回false。

如:confirmEnding("He has to give me a new name", "name")应该返回 true

  confirmEnding("He has to give me a new name", "na")应该返回 false.

function confirmEnding(str, target) {
var targetLength=target.length;
var strEnd=str.substr(str.length-targetLength);
if(strEnd==target){
return true;
}
return false;
}
8.重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串。

如:repeat("abc", 3) 应该返回 "abcabcabc" repeat("abc", -2) 应该返回 ""

function repeat(str, num) {
var originalStr=str;
if(num<=0){
return "";
}
else{
for(var i=1; i<num; i++){
str+=originalStr;
}
return str;
}
}
9.如果字符串的长度比指定的参数num长,则把多余的部分用...来表示。

说明:插入到字符串尾部的三个点号也会计入字符串的长度。但如果指定的参数num小于或等于3,则添加的三个点号不会计入字符串的长度。

如:truncate("A-tisket a-tasket A green and yellow basket", 11) 应该返回 "A-tisket..."

  truncate("Absolutely Longer", 2) 应该返回 "Ab...".

function truncate(str, num) {
// Clear out that junk in your trunk
if(num<=3){
str=str.slice(0,num)+"...";
return str;
}
else if(num>=str.length){
return str;
}
else{
str=str.slice(0,num-3)+"...";
return str;
}
}
10.把一个数组arr按照指定的数组大小size分割成若干个数组块。

说明:例如:chunk([1,2,3,4],2)=[[1,2],[3,4]];  chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]];

如:chunk([0, 1, 2, 3, 4, 5], 3)应该返回 [[0, 1, 2], [3, 4, 5]]

  chunk([0, 1, 2, 3, 4, 5, 6], 3) 应该返回 [[0, 1, 2], [3, 4, 5], [6]]

function chunk(arr, size) {
var newArrLength=Math.ceil(arr.length/size);
var innerArr=[];
for (var i=0; i<newArrLength; i++){
innerArr.push(arr.splice(0,size));
}
return innerArr;
}
11.返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始。

如:slasher([1, 2, 3], 2) 应该返回 [3]

  slasher([1, 2, 3], 9) 应该返回 [].

  slasher([1, 2, "chicken", 3, "potatoes", "cheese", 4], 5)应该返回 ["cheese", 4]

function slasher(arr, howMany) {
arr.splice(0,howMany);
return arr;
}
12. 如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。

说明:["hello", "Hello"]应该返回true,因为在忽略大小写的情况下,第二个字符串的所有字符都可以在第一个字符串找到。

   ["hello", "hey"]应该返回false,因为字符串"hello"并不包含字符"y"。

   ["Alien", "line"]应该返回true,因为"line"中所有字符都可以在"Alien"找到。

function mutation(arr) {
var exist;
arr[0]=arr[0].toLowerCase();
arr[1]=arr[1].toLowerCase();
for(var i=0; i<arr[1].length; i++){
exist=arr[0].indexOf(arr[1].charAt(i));
if(exist==-1){
return false;
}
}
return true;
}
13.删除数组中的所有假值(false , null , 0 , NaN, undefined , "")

如:bouncer([7, "ate", "", false, 9]) 应该返回 [7, "ate", 9]

  bouncer([false, null, 0, NaN, undefined, ""]) 应该返回 []

function bouncer(arr) {
return arr.filter(Boolean);
}
14.实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值

如:destroyer([1, 2, 3, 1, 2, 3], 2, 3) 应该返回 [1, 1]

  destroyer([2, 3, 2, 3], 2, 3) 应该返回 []

  destroyer(["tree", "hamburger", 53], "tree", 53) 应该返回 ["hamburger"]

function destroyer(arr) {
var destroyElementArr=[];
for(var i=1; i<arguments.length; i++){
destroyElementArr.push(arguments[i]);
}
var filtered=arguments[0].filter(function(num){
if(destroyElementArr.indexOf(num)<0){
return true;
}
return false;
});
return filtered;
}
15. 先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引

说明:where([1,2,3,4], 1.5) 应该返回 1。因为1.5插入到数组[1,2,3,4]后变成[1,1.5,2,3,4],而1.5对应的索引值就是1

如:where([10, 20, 30, 40, 50], 35) 应该返回 3

  where([2, 20, 10], 19) 应该返回 2

function where(arr, num) {
arr.sort(function (a,b){return a-b;});
for (var i=0; i<arr.length; i++){
if(num<=arr[i]){
return i;
}
}
return i;
}
16.写一个ROT13函数,实现输入加密字符串,输出解密字符串。

说明:ROT13密码的原理是字母会移位13个位置。由'A' ↔ 'N', 'B' ↔ 'O',以此类推。如第一个字母为A,就将其向后推13位变为N,第二个字母为B,就将其向后推13位变为O,以此类推。当遇上字母N时,又将其向前推13位变为A,以此类推。具体有关ROT13的解释可参考 http://www.baike.com/wiki/ROT13&prd=so_1_doc 。另外,所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,跳过它们。

如:rot13("SERR PBQR PNZC") 应该解码为 "FREE CODE CAMP"

  rot13("SERR YBIR?") 应该解码为 "FREE LOVE?"

  rot13("GUR DHVPX OEBJA QBT WHZCRQ BIRE GUR YNML SBK.")应该解码为 "THE QUICK BROWN DOG JUMPED OVER THE LAZY FOX."

function rot13(str) {
str=str.replace(/[A-Z]/g,function (word){
if(word>="N"){
b=String.fromCharCode(word.charCodeAt(0)-13);
}
else{
b=String.fromCharCode(word.charCodeAt(0)+13);
}
return b;
});
return str;
}

FCC中文网:https://freecodecamp.cn

欢迎大家一起交流学习

FCC的javascript初级算法题解答的更多相关文章

  1. FCC上的初级算法题

    核心提示:FCC的算法题一共16道.跟之前简单到令人发指的基础题目相比,难度是上了一个台阶.主要涉及初步的字符串,数组等运算.仍然属于基础的基础,官方网站给出的建议完成时间为50小时,超出了之前所有非 ...

  2. LeetCode初级算法(数组)解答

    这里记录了LeetCode初级算法中数组的一些题目: 加一 本来想先转成整数,加1后再转回去:耽美想到测试的例子考虑到了这个方法的笨重,所以int类型超了最大范围65536,导致程序出错. class ...

  3. FCC上的javascript算法题之中级篇

    FCC中的javascript中级算法题解答 中级算法的题目中用到了很多js的知识点,比如迭代,闭包,以及对json数据的使用等等,现在将自己中级算法的解答思路整理出来供大家参考讨论.欢迎大家提出新的 ...

  4. fcc的中级算法题

    核心提示:这是网上开源编程学习项目FCC的javascript中级编程题(Intermediate Algorithm Scripting(50 hours)),一共20题.建议时间是50个小时,对于 ...

  5. JavaScript算法题之–随机数的生成

    JavaScript算法题之–随机数的生成 需求描述:从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现. 先来生成一个有序的数组: 1 var arr = [], 2      ...

  6. leetcode算法题(JavaScript实现)

    题外话 刷了一段时间的codewars的JavaScript题目之后,它给我最大的感受就是,会帮助你迅速的提升你希望练习的语言的API的熟悉程度,Array对象.String对象等原生方法,构造函数. ...

  7. 大公司面试经典数据结构与算法题C#/Java解答

    几个大公司(IBM.MicroSoft and so on)面试经典数据结构与算法题C#解答 1.链表反转 我想到了两种比较简单的方法 第一种是需要开一个新的链表,将原链表的元素从后到前的插入到新链表 ...

  8. 面试经典算法题集锦——《剑指 offer》小结

    从今年 3 月份开始准备找实习,到现在校招结束,申请的工作均为机器学习/数据挖掘算法相关职位,也拿到了几个 sp offer.经历这半年的洗礼,自己的综合能力和素质都得到了一个质的提升. 实话说对于未 ...

  9. (转载)Autodesk面试技术题解答

    Autodesk面试技术题解答 By SmartPtr(http://www.cppblog.com/SmartPtr/)          近一年以来,AUTODESK的面试题在网上是闹的沸沸扬扬, ...

随机推荐

  1. 论文笔记:CNN经典结构2(WideResNet,FractalNet,DenseNet,ResNeXt,DPN,SENet)

    前言 在论文笔记:CNN经典结构1中主要讲了2012-2015年的一些经典CNN结构.本文主要讲解2016-2017年的一些经典CNN结构. CIFAR和SVHN上,DenseNet-BC优于ResN ...

  2. leetcode-217-Contains Duplicate(使用排序来判断整个数组有没有重复元素)

    题目描述: Given an array of integers, find if the array contains any duplicates. Your function should re ...

  3. window.open完美替代window.showModalDialog

    var url = "http//:www.baidu.com/" var name = "百度"; var iWidth = 1100;//弹窗宽度 var ...

  4. 使用Chrome-headless模式下,截屏不全屏的问题

    在headless模式下,是没有打开浏览器窗口的,那么driver.maximize_window(),找不到目标也打不开. 我们可以换一种方式,去在无头模式下,指定浏览器的窗口大小运行即可. __o ...

  5. 深入浅出理解基于 Kafka 和 ZooKeeper 的分布式消息队列

    消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题.实现高性能,高可用,可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件. 本场 Chat 主要内容: Kafk ...

  6. 简单工厂模式&策略模式-简介与区别

    不得不说,这两种模式真的很像. 相似点:都用到了面向对象的继承.多态.抽象,都拥有相似的结构. 不同点:工厂模式仅提供具体的实例对象,怎么使用这个对象是client的自由,策略模式client可以通过 ...

  7. C#二进制位算 权限

    关于权限管理,之前所做的都是一个权限对应一条数据,比方A页面有增删改查四个权限,那么用户在权限管理表中相对应AA页面有四条记录.后来改用二进制运算,发现省事很多. 首先说下位运算 熟悉一下操作符,懒得 ...

  8. Visual Studio 跨平台開發實戰(2) - Xamarin.iOS 基本控制項介紹 (转帖)

    前言 在上一篇文章中, 我們介紹了Xamarin 以及簡單的HelloWorld範例, 這次我們針對iOS的專案目錄架構以及基本控制項進行說明. 包含UIButton,, UISlider, UISw ...

  9. Linus' Law

    Given enough eyeballs, all bugs are shallow.                                               ------埃里克 ...

  10. springboot: mybatis的使用

    第一步:引入mybatis依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifa ...