FreeCodeCamp 中级算法(个人向)
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) {
// :)
var list={
"&":"&",
"<":"<",
">":">",
"\"":""",
"\'":"'"
};
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 中级算法(个人向)的更多相关文章
- FreeCodeCamp 高级算法(个人向)
freecodecamp 高级算法地址戳这里. freecodecamp的初级和中级算法,基本给个思路就能完成,而高级算法稍微麻烦了一点,所以我会把自己的解答思路写清楚,如果有错误或者更好的解法,欢迎 ...
- FCC编程题之中级算法篇(上)
介绍 FCC: 全称为freeCodeCamp,是一个非盈利性的.面向全世界的编程练习网站.这次的算法题来源于FCC的中级算法题. FCC中级算法篇共分为(上).(中).(下)三篇.每篇各介绍7道算法 ...
- FCC中级算法(上)
在学习FCC中级算法这一块,自己遇到了很多问题,通过RSA也慢慢把问题解决了,发现每一个问题都会有很多的解决思路,因此把自己想到的一些思路记录到这里. 1. Sum All Numbers in a ...
- FCC编程题之中级算法篇(下)
介绍 本篇是"FCC编程题之中级算法篇"系列的最后一篇 这期完结后,下期开始写高级算法,每篇一题 目录 1. Smallest Common Multiple 2. Finders ...
- FCC编程题之中级算法篇(中)
介绍 接着上次的中级算法题 目录 1. Missing letters 2. Boo who 3. Sorted Union 4. Convert HTML Entities 5. Spinal Ta ...
- fcc的中级算法题
核心提示:这是网上开源编程学习项目FCC的javascript中级编程题(Intermediate Algorithm Scripting(50 hours)),一共20题.建议时间是50个小时,对于 ...
- leetcode探索中级算法
leetcode探索中级答案汇总: https://leetcode-cn.com/explore/interview/card/top-interview-questions-medium/ 1)数 ...
- freecodecamp 基础算法题笔记
数组与字符串的转化 字符串转化成数组 reverse方法翻转数组顺序 数组转化成字符串. function reverseString(str) { a= str.split("" ...
- FreeCodeCamp初级算法部分学习
Reverse a String 翻转字符串 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串. 你的结果必须得是一个字符串 当你完成不了挑战的时候,记得开大招 ...
随机推荐
- SQL性能优化(Oracle)
首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条记录, ...
- Java学习笔记14--动态代理
InvocationHandler接口 public interface InvocationHandler{ public Object invoke(Object proxy,Method met ...
- C++中,指针数组和数组指针
这俩兄弟长得实在太像,以至于经常让人混淆.然而细心领会和甄别就会发现它们大有不同. 前者是指针数组,后者是指向数组的指针.更详细地说. 前: 指针数组;是一个元素全为指针的数组. 后: 数组指针;可以 ...
- Apache-Commons包作用说明
Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.项目地址http://commons.apache.org/ Commons BeanUtils 提供 ...
- 使用事件等待句柄EventWaitHandler 实现生产者、消费者队列
using System; using System.Threading; using System.Collections.Generic; class ProducerConsumerQueue ...
- 理解em,rem以及rem的失效问题
在平常做网站写代码的时候一般都是使用px,在之前的学习时就略微的学习了一些关于em.rem的知识,但是由于一直没有用到过,所以几乎全部忘记了.今天在研究一些知识的时候用到了em,所以特意将学到的知识总 ...
- loadrunner11录制脚本打开IE9失败,浏览器崩溃,显示无法响应
解决办法:工具-->Internet选项-->高级-->禁止ie启用第三方浏览器扩展
- 第一个python程序hello.py
使用vim编辑代码: #!/usr/bin/python2.7 #-*-coding:utf-8-*- name = raw_input('请输入你的名字:') print 'Hello,',name ...
- Web大文件上传控件-asp.net-bug修复-Xproer.HttpUploader6.2
版权所有 2009-2016荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...
- T4模板之初体验(语法)
一.什么是T4模板 T4是Text Template Transformation Toolkit(文本模板转换工具包)的四个英文首字母的简称.是微软提供的一种代码生成引擎. 在ADO.NET实体数据 ...