FreeCodeCamp( FCC)前端工程师 中级算法练习 分析与解答(全)(精)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了FreeCodeCamp( FCC)前端工程师 中级算法练习 分析与解答(全)(精),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8611字,纯文字阅读大概需要13分钟。
内容图文
[TOC]
说在前面
这是要一篇非常简单的新手能看懂的文章,希望你喜欢。由于在 freecodecamp 中貌似!?无法使用 ES6
的某些语法,未测试具体。所以基本上用古老?!的ES5,4
写成,谢谢。在写本博文前没有参考过别人的做法,纯手打,我的方法肯定不是最好,只是以我自己喜欢的方式在写而已。
纯原创,转载请联系作者https//:wusuai1995@qq.com
、givingwu@gmail.com
。
- freecodecamp China
- 不明白
API
请参考MDN给出的解释 - 个别题目没有判断函数参数及其类型,仅通过了
Run tests
- 如果你最近在写微信小程序的蓝牙的话请参考wx-bluetooth
- 有疑惑请留言
开始
Sum All Numbers in a Range
- 先对传入数组升序排列,拿到 [min, max]
- 然后 generateArr 成一个 [min, min+1, min+2, ..., max]
- Array.prototype.reduce 方法从左至右求和
function
sumAll(arr) {if (!Array.isArray(arr) ||!arr ||!arr.length) return;
arr =arr.sort(function(a, b){return a-b;});
arr =generateArr(arr[0], arr[1]);console.log(arr);returnarr.reduce(function(accu, curr){return accu += curr;});}functiongenerateArr(min, max) {var arr = [];while (min <= max) {arr.push(min);
min++;}return arr;}
Diff Two Arrays
- 合并两个数组成一个数组
- 通过一个 obj 缓存数组中每项的出现次数
- 返回 obj[arr[i]] 仅出现一次的项组成的数组
function
diff(arr1, arr2) {if (!Array.isArray(arr1) ||!Array.isArray(arr2)) return;var newArr =arr1.concat(arr2);returnunique(newArr);}functionunique(arr) {var a = [], i, l, item, key, obj ={};for (i =0, l =arr.length; i < l; i++) {
item = arr[i];if (obj[item] ===undefined) {
obj[item] = [item];}else{
obj[item].push(item);}}console.log(arr, obj);for (key in obj) {if (obj.hasOwnProperty(key)) {if (obj[key].length===1){
a =a.concat(obj[key]);}}}return a;}
Roman Numeral Converter
- 先把每个数所对应的阿拉伯数字和罗马数字取出来并一一对应
var RomanNumArr = [1000,900,500,400,100,90,50,40,10,9,5,4,1],
RomanNumStrArr = [‘M‘,‘CM‘,‘D‘,‘CD‘,‘C‘,‘XC‘,‘L‘,‘XL‘,‘X‘,‘IX‘,‘V‘,‘IV‘,‘I‘];
- 然后对给出的数进行 倒推求余 的推算并返回对应数字数组,比如139 = [100 + 39] = [100 + 3 * 10 + 9] = [100, 10, 10, 10, 9]
function
getSeparatedRomanNumArr (num, arr) {
arr = arr || [];for (var i =0, l =RomanNumArr.length; i < l; i++) {var curr = RomanNumArr[i], next, int;if (num >= curr) {if (num % curr ===0) {returnpushNumByTimes2Arr(curr, num / curr, arr);}else{
next = num % curr;
int = num - next;returngetSeparatedRomanNumArr(next,pushNumByTimes2Arr(curr, int / curr, arr));}}}}functionpushNumByTimes2Arr(num, times, arr) {while (times) {arr.push(num);
times--;}return arr;}
- 将每个阿拉伯数字对上罗马数字,然后对返回的数组进行 Array.prototype.join 即可,例如上面例子139 = [100, 10, 10, 10, 9] = [‘C‘, ‘X‘, ‘X‘, ‘X‘, ‘IX‘].join(‘‘) = ‘CXXXIX‘
function
convert(num) {if (!num ||‘number‘!==typeof+num) thrownewTypeError();var romanNumArr =getSeparatedRomanNumArr(num);returnromanNumArr.map(function(item){return RomanNumStrArr[RomanNumArr.indexOf(item)];}).join(‘‘);}
Where art thou
-
for
loop取出collection
中的每个对象的keys
然后与source
对象的keys
进行比对通过函数getSameItems
- 将当前
collection[i]
的key
的与sameKeys
进行比对,如果全部全等就match
反正false
function
where(collection, source) {var arr = [], sourceKeys =Object.keys(source), obj, key, objKeys,
sameKeys, i, l =collection.length, j, k, matched;for (i =0; i < l; i++) {
obj = collection[i];
objKeys =Object.keys(obj);if (objKeys.length<sourceKeys.length) continue;
sameKeys =getSameItems(sourceKeys, objKeys);if (sameKeys.length<sourceKeys.length) continue;
matched =true;if (sameKeys &&sameKeys.length) {for (j =0, k =sameKeys.length; j < k; j++) {
key = sameKeys[j];if (obj[key] !== source[key]) {
matched =false;}}}if (matched) arr.push(obj);}return arr;}functiongetSameItems (arr1, arr2) {if (!arr1 ||!arr1.length||!arr2 ||!arr2.length) thrownewTypeError();var arr = [];arr1.forEach(function(item){if (~arr2.indexOf(item)) {arr.push(item);}});return arr;}
Search and Replace
function
myReplace(str, before, after) {
after =isUpperCase(before[0]) ?camelize(after) : after;
str =str.replace(before, after);return str;}functioncamelize (str) {returnstr.slice(0,1).toUpperCase() +str.slice(1,str.length);}functionisUpperCase(s) {return s ===s.toUpperCase();}
Pig Latin
- 根据题意先写出元音数组
vowels
,然后分割字符串成数组并比对是否存在元音字符,如果有则立即返回该index
位置,反之返回undefined
- 如果
index === 0
则返回str + ‘way‘
反之返回str.slice(vowelIndex, str.length) + str.substr(0, vowelIndex) + ‘ay‘
;
function
translate(str) {var vowelIndex =findVowelsIndex(str);
str = vowelIndex ===0? str +‘way‘ : str.slice(vowelIndex,str.length) +str.substr(0, vowelIndex) +‘ay‘;return str;}functionfindVowelsIndex (str) {var vowels = [‘a‘,‘e‘,‘i‘,‘o‘,‘u‘];var strArr =str.split(‘‘), i, l, index;for (i =0, l =strArr.length; i < l; i++) {
index =vowels.indexOf(strArr[i]);if (~index) {return i;}}}
DNA Pairing
function
pair(str) {var strArr =str.split(‘‘), pairArr = [], pair, i, l;for (i =0, l =strArr.length; i < l; i++) {switch(strArr[i]){case‘C‘:
pair =‘G‘;break;case‘G‘:
pair =‘C‘;break;case‘A‘:
pair =‘T‘;break;case‘T‘:
pair =‘A‘;break;}pairArr.push([strArr[i], pair]);}return pairArr;}
Missing letters
- 比对给出的
str
的每个字符,并全部转换成 - 如果当前字符的 charCode 不等于
next
的charCode
则找到了该 迷失字符
function
fearNotLetter(str) {var strArr, i, l, curr, next, noMissing =true;
strArr =str.split(‘‘).map(function(word){returnword.charCodeAt();});for (i =0, l =strArr.length; i < l; i++) {
curr = strArr[i];
next = strArr[i +1];console.log(‘curr:‘, curr,‘next:‘, next);if (i !== l -1&&++curr !== next) {
str =String.fromCharCode(curr);
noMissing =false;break;}}return noMissing ?undefined : str;}
Boo who
function
boo(bool) {// What is the new fad diet for ghost developers? The Boolean.if (typeof bool !==‘boolean‘) returnfalse;returntrue;}
Sorted Union
function
unite(arr1, arr2, arr3) {returnArray.prototype.reduce.call(arguments,function(accu, curr){console.log(‘accu:‘, accu);console.log(‘curr:‘, curr);
curr =curr.filter(function(item){return!~accu.indexOf(item);});returnaccu.concat(curr);});}
Convert HTML Entities
function
convert(str) {var i, j, reg, chars = [‘&‘,‘<‘,‘>‘,‘"‘,"‘"], strs = [‘&‘,‘<‘,‘>‘,‘"‘,‘'‘];for (i =0, l =chars.length; i < l; i++) {
reg =newRegExp(‘\\‘+ chars[i],‘gm‘);
str =str.replace(reg, strs[i]);}return str;}
Spinal Tap Case
function
spinalCase(str) {// "It‘s such a fine line between stupid, and clever."// not, there is a comma still.// --David St. Hubbinsvar reg1 =/(\s|\_)/g, reg2 =/([A-Z])/g;if (reg1.test(str)) {
str =str.replace(reg1,‘-‘);}elseif (reg2.test(str)) {
str =str.replace(reg2,‘-$1‘);}
str =str.toLowerCase();return str;}
Sum All Odd Fibonacci Numbers
- 先拿到斐波那契中所有小于 num 的数
- 然后求该数组中所有奇数(odd)项的和
function
sumFibs(num) {if (num <=2) return num;var a =1, b =1, arr = [a, b], sum =0, i, l;while (sum < num) {
sum = a + b;if (sum <= num) arr.push(sum);
a = b;
b = sum;}console.log(arr);
num =0;for (i =0, l =arr.length; i < l; i++) {if (arr[i] %2!==0) {
num += arr[i];}}return num;}
Sum All Primes
- 先将所有数组转出来(抱歉这里用了ES6的新方法
Array.from
,请参考MDN Array.from) - 判断每一个数是否是质数,通过函数isPrime
function
sumPrimes(num) {returnArray.from({length: num}).map(function(item, index){return++index;}).filter(function(item){returnisPrime(item);}).reduce(function(accu, curr){return accu += curr;});}functionisPrime (num) {if (num <=1) return;var i, l, prime =true;for (i =2, l = num / 2+1; i < l; i++) {if (num % i ===0) {
prime =false;break;}}return prime;}
Smallest Common Multiple
PS: 这又是一个继罗马数字后不错的中级算法题
先上一波我用到的资料(即思路):
- 一个优秀的答案
- Git上老外的答案
- 如何求最小公倍数,我选用该帖子中 分解质因数法,所以我们得先求出所有的该区间中每个数的质因数数组,然后去重,最后乘上所有数的质因数
- 欧几里德算法
- 最大公约数
- 质因数分解
一个优秀的答案,同时向欧几里德表示respect
。
// *?!
Finders Keepers
function
find(arr, func) {var num =0;returnarr.filter(func)[0];}
Drop it
PS: 那一段卖队友也是很666,我表示赞同。但辅助会怎么想?
function
drop(arr, func) {// Drop them elements.var n =arr.shift();if (n !==undefined) {if (!func(n)) {returndrop(arr, func);}else{arr.unshift(n);return arr;}}else{return [];}return arr;}
Steamroller
function
steamroller(arr) {// I‘m a steamroller, baby var result = [], i, l;for(i =0, l =arr.length; i < l; i++){if(Array.isArray(arr[i])){
result =result.concat(steamroller(arr[i]));}else{result.push(arr[i]);}}return result;}
Binary Agents
- 将二进制字符串参数通过
空格
切分为数组 - 将2进制转为10进制
- 通过
String.fromCharCode
返回字符串
function
binaryAgent(str) {returnstr.split(/\s/g).map(function(s){returnString.fromCharCode(parseInt(s,2));}).join(‘‘);}
Everything Be True
function
every(collection, pre) {// Is everyone being true?returncollection.every(function(item) {return item[pre];});}
Arguments Optional
函数curry化参考JavaScript currying
function
add(a, b) {var args =Array.prototype.slice.call(arguments,0);if (typeof a !==‘number‘) returnundefined;if (args.length<2) {returnfunction (b) {if (typeof b !==‘number‘) returnundefined;args.push(b);returnadd.apply(this, args);};}else{if (typeof b !==‘number‘) returnundefined;}return a + b;}
结语
不算上我做题的时间,我就是复制自己写好的代码也花了一段时间。而且部分题目没有被 freeCodeCamp 记录了,又重新来一次,但只有前几道是。应该是间隔一段时间后,数据会被清掉而只记录是否完成状态。
表示这个 Smallest Common Multiple 我写的递归未过,所以不贴。
感谢上面贴出的所有引用连接,如果有任何引用存在问题,请联系作者立即下线。
观看容易,手打不易,且看且学习。
原文:https://www.cnblogs.com/givingwu/p/8400754.html
内容总结
以上是互联网集市为您收集整理的FreeCodeCamp( FCC)前端工程师 中级算法练习 分析与解答(全)(精)全部内容,希望文章能够帮你解决FreeCodeCamp( FCC)前端工程师 中级算法练习 分析与解答(全)(精)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。