freecodecamp 中级算法地址戳这里

Sum All Numbers in a Range

我们会传递给你一个包含两个数字的数组。返回这两个数字和它们之间所有数字的和。

 function sumAll(arr) {
arr.sort(function(a,b){
return a-b;
});
var a=arr[0];
var sum=arr[0];
while( a<arr[1] ){
a++;
sum+=a;
}
return sum;
} sumAll([1, 4]);

Diff Two Arrays

比较两个数组,然后返回一个新数组,该数组的元素为两个给定数组中所有独有的数组元素。换言之,返回两个数组的差异。

 function diff(arr1, arr2) {
var newArr = [];
// Same, same; but different.
var len,long,short;
if( arr1.length<=arr2.length ){
len=arr1.length;
short=arr1;
long=arr2;
}else{
len=arr2.length;
short=arr2;
long=arr1;
} for(var i=0;i<len;i++){
var index=long.indexOf( short[i] );
if( index==-1 ){
newArr.push( short[i] );
}else{
long.splice(index,1);
}
}
newArr=newArr.concat(long);
return newArr;
} diff([1, 2, 3, 5], [1, 2, 3, 4, 5]);

Roman Numeral Converter

将给定的数字转换成罗马数字

var convert=(function() {
//1 5 10 50 100 500 1000
//I V X L C D M
var arr=[["I","V"],["X","L"],["C","D"],["M"]]; //检索的数组缓存起来 return function(num){
var str="";
var num_arr=String(num).split("");
for(var i=0,l=num_arr.length;i<l;i++){ //对每一位的数字进行处理
var x=parseInt( num_arr[i] );
str+=handle(arr[l-1-i],arr[l-i],x); //传参
}
return str;
}; })(); function handle(arr,big_arr,x){ //这里是对输入的x数字进行处理,arr和big_arr根据传参确定,这里对应的是罗马数字规则
var res="";
if( x==0 ){
return res;
} if( x<=3 ){
for(var i=0;i<x;i++){
res+=arr[0];
}
}else if( x==4 ){
res=arr[0]+arr[1];
}else if( x==9 ){
res=arr[0]+big_arr[0];
}else{ //大于等于5但是小于9的
var cha=x-5;
res=arr[1];
for(var i=0;i<cha;i++){
res+=arr[0];
}
}
return res;
} convert(36);

Where art thou

写一个 function,它遍历一个对象数组(第一个参数)并返回一个包含相匹配的属性-值对(第二个参数)的所有对象的数组。如果返回的数组中包含 source 对象的属性-值对,那么此对象的每一个属性-值对都必须存在于 collection 的对象中。

function where(collection, source) {
var arr = [];
var target=Object.keys(source); //数组
outer:for(var i in collection){
for(var j in target){
if( collection[i].hasOwnProperty(target[j])===false || collection[i][target[j]]!=source[target[j]] ){
continue outer;
}
} arr.push(collection[i]); }
// What's in a name?
return arr;
} where([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });

Search and Replace

使用给定的参数对句子执行一次查找和替换,然后返回新句子。

function myReplace(str, before, after) {  //查找替换
var arr=str.split(" ");
var index=arr.indexOf(before);
arr.splice(index,1,change(before,after)); return arr.join(" ");
} function change(before,after){ //保证单词大小写不变
var isLower=judge(before); //小写返回true
var change_arr=after.split(""); change_arr[0]=isLower?change_arr[0].toLowerCase():change_arr[0].toUpperCase(); return change_arr.join("");
} function judge(str){
if( str.substr(0,1).toLowerCase()==str.substr(0,1) ){ //判断首字母大小写
return true;
}else{
return false;
}
} myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");

Pig Latin

把指定的字符串翻译成 pig latin

常规解法:

function translate(str) { //主体函数
var num=getnum(str); //搜索结果
if ( num==-1 ){
return "没有元音";
}else if( num==0 ){
return str+"way";
}else{
return str.substring(num,str.length)+str.substring(0,num)+"ay";
}
} function getnum(str){ //搜索str中是否有元音字母
return search(str,"a","e","i","o","u");
}; function search(){ //搜索是否含有一些字符,有就返回序号,否则返回-1
var str=[].shift.apply(arguments);
var n;
var flag=true;
for(var i=0,l=arguments.length;i<l;i++){
var nth=str.indexOf(arguments[i]);
if( nth>-1 ){
n=(n==undefined)?nth:(n<nth?n:nth);
flag=false;
}
}
return flag?-1:n;
}; translate("consonant");

正则解法:

function translate(str){
var str2=str.replace(/[aeiou]/g,"|");
var index=str2.indexOf("|");
if ( index==-1 ){
return "没有元音";
}else if( index==0 ){
return str+"way";
}else{
return str.substring(index,str.length)+str.substring(0,index)+"ay";
}
} translate("consonant");

DNA Pairing

DNA 链缺少配对的碱基。依据每一个碱基,为其找到配对的碱基,然后将结果作为第二个数组返回。

function pair(str) {
var arr=[["A","T"],["C","G"]];
var result=[];
var str_arr=str.split(""); for(var i in str_arr){
for(var j in arr){
var index=arr[j].indexOf( str_arr[i] );
if( index!=-1 ){
result.push( [str_arr[i],arr[j][1-index]] );
}
}
}
return result;
} pair("GCG");

Missing letters

从传递进来的字母序列中找到缺失的字母并返回它。

function fearNotLetter(str) {
var len=str.length;
var before,after;
var res="";
if( str.charCodeAt(len-1)-str.charCodeAt(0)+1==len ){ //首尾相差的数量正确,返回undefined
return undefined;
}
for(var i=0;i<len;i++){ //遍历字符串的序号
before=str.charCodeAt(i);
after=str.charCodeAt(i+1);
if( after-before>1 ){ //发现相邻不连续
do{
res+=String.fromCharCode(before+1);
before++;
}while( after-before>1 ); return res;
}
}
} fearNotLetter("abce");

Boo who

检查一个值是否是基本布尔类型,并返回 true 或 false。

function boo(bool) {
// What is the new fad diet for ghost developers? The Boolean.
if( typeof(bool)==="boolean" ){
return true;
}else{
return false;
}
} boo(null);

Sorted Union

写一个 function,传入两个或两个以上的数组,返回一个以给定的原始数组排序的不包含重复值的新数组。

function unite() {
var arr=[];
for(let i in arguments){
arr.push( arguments[i] );
}
var res=arr.reduce(function(a,b){
for(var i=0,l=a.length;i<l;i++){
var index=b.indexOf(a[i]);
if( index!=-1 ){
b.splice(index,1);
}
}
return a.concat(b);
});
return res;
} unite([1, 3, 2], [5, 2, 1, 4], [2, 1]);

Convert HTML Entities

将字符串中的字符 &<>" (双引号), 以及 ' (单引号)转换为它们对应的 HTML 实体。

function convert(str) {
// &colon;&rpar;
var list={
"&":"&amp;",
"<":"&lt;",
">":"&gt;",
"\"":"&quot;",
"\'":"&apos;"
};
for(var key in list){
str=str.replace(new RegExp(key,"g"),list[key]);
}
return str;
} convert("Dolce & Gabbana");

Spinal Tap Case

将字符串转换为 spinal case。Spinal case 是 all-lowercase-words-joined-by-dashes 这种形式的,也就是以连字符连接所有小写单词

function spinalCase(str) {
// "It's such a fine line between stupid, and clever."
// --David St. Hubbins
str=str.replace(/_/g," ");
var arr=str.split(" ");
if( arr.length==1 ){
str=str.replace(/([A-Z])/g," $1");
} str=str.trim().toLowerCase().replace(/[\s]/g,"-"); return str;
} spinalCase('thisIsSpinalTap');

个人方法感觉很多地方啰嗦了点,可以进一步改进。

Sum All Odd Fibonacci Numbers

给一个正整数num,返回小于或等于num的斐波纳契奇数之和。

function sumFibs(num) {
var arr=get(num); //获取数列
var res=arr.filter(function(a){ //筛选出奇数
return a%2!==0;
}).reduce(function(a,b){ //返回奇数之和
return a+b;
});
return res;
} function get(num){ //返回一个斐波纳契数列,最后一位小于等于num
var arr=[1];
var sum=1;
var before=0;
var after=1;
while( sum<=num ){
arr.push(sum);
before=after;
after=sum;
sum=before+after;
}
return arr;
}
sumFibs(4);

Sum All Primes

求小于等于给定数值的质数之和。

function sumPrimes(num) {
var res=getarr(num).reduce(function(a,b){
return a+b;
});
return res;
} function getarr(num){ //返回质数数组
var arr=[];
outer:for(var i=2;i<=num;i++){
for(var j=2;j<i;j++){
if( i%j===0 ){
continue outer;
}
} arr.push(i);
}
return arr;
} sumPrimes(10);

Smallest Common Multiple

找出能被两个给定参数和它们之间的连续数字整除的最小公倍数。

function smallestCommons(arr) {
var res=make_arr(arr).reduce(function(a,b){ //利用reduce,两两求最小公倍数
return gcd(a,b);
});
return res;
} function make_arr(arr){ //返回包含给定参数和他们之间连续数字的顺序数组
arr.sort(function(a,b){
return a-b;
});
var max=arr.pop();
var num=arr[0];
while( num<max ){
num++;
arr.push(num);
}
return arr; } function gcd(a,b){ //遍历,获得a,b的最小公倍数
var max=Math.max(a,b),
min=Math.min(a,b),
count; for(var i=1;i<=max;i++){
count=min*i;
if(count%max===0){
return count;
}
} } smallestCommons([1,5]);

Finders Keepers

写一个 function,它浏览数组(第一个参数)并返回数组中第一个通过某种方法(第二个参数)验证的元素。

function find(arr, func) {
return arr.filter(func)[0];
} find([1, 2, 3, 4], function(num){ return num % 2 === 0; });

Drop it

让我们来丢弃数组(arr)的元素,从左边开始,直到回调函数return true就停止。

function drop(arr, func) {
// Drop them elements.
var top=0;
for(var l=arr.length;top<l;top++){
if( func(arr[top]) ){
break;
}
}
return arr.slice(top);
} drop([1, 2, 3, 4], function(n) {return n >= 3;});

Steamroller

对嵌套的数组进行扁平化处理。你必须考虑到不同层级的嵌套。

function steamroller(arr) {
// I'm a steamroller, baby
while (arr.some(item => item instanceof Array)) {
arr = [].concat(...arr);
}
return arr;
} steamroller([1, [2], [3, [[4]]]]);

Binary Agents

传入二进制字符串,翻译成英语句子并返回。

function binaryAgent(str) {
var arr=str.split(" ");
for(var i in arr){
arr[i]=String.fromCharCode( parseInt(arr[i],2) );
}
var res=arr.join("");
return res;
} binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111");

Everything Be True

完善编辑器中的every函数,如果集合(collection)中的所有对象都存在对应的属性(pre),并且属性(pre)对应的值为真。函数返回ture。反之,返回false。

function every(collection, pre) {
// Is everyone being true?
var res=collection.every(function(item){
return item[pre];
});
return res;
} every([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}, {"user": "Laa-Laa", "sex": "female"}, {"user": "Po", "sex": "female"}], "sex");

Arguments Optional

创建一个计算两个参数之和的 function。如果只有一个参数,则返回一个 function,该 function 请求一个参数然后返回求和的结果。

function add() {
var arr=[].concat(...arguments);
if( arr.some(function(ele){
return typeof ele!="number";
}) ){ //参数出现非数字类型,返回undefined
return undefined;
}
if( arr.length==2 ){
return arr[0]+arr[1];
}
return function(a){
if( typeof a != "number" ){ //同上
return undefined;
}
return a+arr[0];
};
} add(2)(3);

FreeCodeCamp 中级算法(个人向)的更多相关文章

  1. FreeCodeCamp 高级算法(个人向)

    freecodecamp 高级算法地址戳这里. freecodecamp的初级和中级算法,基本给个思路就能完成,而高级算法稍微麻烦了一点,所以我会把自己的解答思路写清楚,如果有错误或者更好的解法,欢迎 ...

  2. FCC编程题之中级算法篇(上)

    介绍 FCC: 全称为freeCodeCamp,是一个非盈利性的.面向全世界的编程练习网站.这次的算法题来源于FCC的中级算法题. FCC中级算法篇共分为(上).(中).(下)三篇.每篇各介绍7道算法 ...

  3. FCC中级算法(上)

    在学习FCC中级算法这一块,自己遇到了很多问题,通过RSA也慢慢把问题解决了,发现每一个问题都会有很多的解决思路,因此把自己想到的一些思路记录到这里. 1. Sum All Numbers in a ...

  4. FCC编程题之中级算法篇(下)

    介绍 本篇是"FCC编程题之中级算法篇"系列的最后一篇 这期完结后,下期开始写高级算法,每篇一题 目录 1. Smallest Common Multiple 2. Finders ...

  5. FCC编程题之中级算法篇(中)

    介绍 接着上次的中级算法题 目录 1. Missing letters 2. Boo who 3. Sorted Union 4. Convert HTML Entities 5. Spinal Ta ...

  6. fcc的中级算法题

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

  7. leetcode探索中级算法

    leetcode探索中级答案汇总: https://leetcode-cn.com/explore/interview/card/top-interview-questions-medium/ 1)数 ...

  8. freecodecamp 基础算法题笔记

    数组与字符串的转化 字符串转化成数组 reverse方法翻转数组顺序 数组转化成字符串. function reverseString(str) { a= str.split("" ...

  9. FreeCodeCamp初级算法部分学习

    Reverse a String 翻转字符串 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串. 你的结果必须得是一个字符串 当你完成不了挑战的时候,记得开大招 ...

随机推荐

  1. C++队列中应该注意的一些问题

    第一次在C++中写类,新手,见笑 #include<iostream.h>#include<iostream>template<typename T> class ...

  2. Java 容器:Collection 初探之 List

    1 ///: JavaBasic//com.cnblogs.pattywgm.day1//CollectionTest.java 2 3 package com.cnblogs.pattywgm.da ...

  3. Ubuntu 14.04下搭建Python3.4 + PyQt5.3.2 + Eric6.0开发平台

    引言 找了很多Python GUI工具集,还是觉得PyQt比较理想,功能强大跨平台,还支持界面设计器.花一天时间折腾了Ubuntu14.04(32位)+ Python3.4 + Qt5.3.2 + P ...

  4. MapReduce --全排序

    MapReduce全排序的方法1: 每个map任务对自己的输入数据进行排序,但是无法做到全局排序,需要将数据传递到reduce,然后通过reduce进行一次总的排序,但是这样做的要求是只能有一个red ...

  5. JVM调优-Java垃圾回收之分代回收

    为什么要进行分代回收? JVM使用分代回收测试,是因为:不同的对象,生命周期是不一样的.因此不同生命周期的对象采用不同的收集方式. 可以提高垃圾回收的效率. Java程序运行过程中,会产生大量的对象, ...

  6. Ext开场布局设计Viewport

    //加载dwr dwr.engine.setAsync(false); //***************************************框架定义部分***************** ...

  7. Silverlight C1.Silverlight.FlexGrid 表格动态列

    很多时候,我们对于表格展示的数据,需要根据条件不停的变化,这就需要表格列能动态生成,即没有Model的概念(万物始于无形).先上主要代码: 一.根据参数绑定列定义 二.根据数据动态创建数据对象,并添加 ...

  8. uploadify 上传遇到跨域问题

    flash上传跨域,一般是加入crossdomain.xml 我用了别人的图片服务器,只能做此下策: //CURLFile 实现 $file = $_FILES['Filedata']['tmp_na ...

  9. linux运维的认知及RHEL7 Unix/Linux 系统 介绍和安装

    如何成为一个优秀的linux运维人员?      如果你有机会和条件:环境能够磨练一个人的能力和意志.      大胆的做你从未做过的项目,每一个项目都是对自身的极大提升.      有好的环境资源不 ...

  10. 【洛谷P1969】积木大赛

    递增区间内累计增量 #include<cstdio> #include<cstring> using namespace std; int a,h,n,ans; int mai ...