坚持又把FCC中级算法刷了一遍,很有价值。尤其是很多思维方式的提升,以及正则的运用也更加熟练。题目又点多21道。不一定全写,因为有的题太简单,也没有什么知识点可讲。但序号还说按照题目本身来给,望见谅。(解析也不想写,怪自己太懒...)有疑惑欢迎留言喔!
2.Diff Two Arrays
比较两个数组,然后返回一个新数组,该数组的元素为两个给定数组中所有独有的数组元素。换言之,返回两个数组的差异。
["andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"] 应该返回 ["diorite", "pink wool"] [1, "calf", 3, "piglet"], [1, "calf", 3, 4] 应该返回 ["piglet", 4]
//解析:把两个数组先合并,过滤掉原数组都存在的元素
function diffArray(arr1,arr2) {
return arr1.concat(arr2).filter(e => !(arr1.includes(e) && arr2.includes(e)));
}
3.Roman Numeral Converter
将给定的数字转换成罗马数字
function convertToRoman(num) {
var lookup ={M:1000,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1};
var romanStr = "";
for (var i in lookup){
while (num >= lookup[i]){
romanStr+=i;
num -= lookup[i];
}
}
return romanStr;
}
4.Where art thou
写一个 function,它遍历一个对象数组(第一个参数)并返回一个包含相匹配的属性-值对(第二个参数)的所有对象的数组。如果返回的数组中包含 source 对象的属性-值对,那么此对象的每一个属性-值对都必须存在于 collection 的对象中。
function whatIsInAName(collection, source) {
var arr = [];
for(var i = 0;i < collection.length;i++){
var flag = true;
for(var key2 in source){
if (source[key2] !== collection[i][key2]){
flag = false;
}
}
if(flag){
arr.push(collection[i]);
}
}
return arr;
}
5.Search and Replace
使用给定的参数对句子执行一次查找和替换,然后返回新句子。
第一个参数是将要对其执行查找和替换的句子。
第二个参数是将被替换掉的单词(替换前的单词)。
第三个参数用于替换第二个参数(替换后的单词)。
注意:替换时保持原单词的大小写。例如,如果你想用单词 "dog" 替换单词 "Book" ,你应该替换成 "Dog"。
function myReplace(str, before, after) {
var newstr = before[0] !== before[0].toUpperCase() ? after : (after[0].toUpperCase()+after.slice(1));
return str.replace(new RegExp(before), newstr);
}
6.Pig Latin
把一个英文单词的第一个辅音或辅音丛(consonant cluster)移到词尾,然后加上后缀 "ay"。
如果单词以元音开始,你只需要在词尾添加 "way" 就可以了。
function translatePigLatin(str) {
str = str.replace(/^([aeiou][a-z]*)$/gi, "$1way"); // 表示,如果开头为aeiou,那么尾部加上way
str = str.replace(/^([^aeiou]+)([a-z]*)$/gi, "$2$1ay");// 如果开头为辅音,第二部分——第一部分——ay
return str;
}
8.Missing letters
从传递进来的字母序列中找到缺失的字母并返回它。
如果所有字母都在序列中,返回 undefined。
function fearNotLetter(str) {
if(str.charCodeAt(str.length-1) - str.charCodeAt(0) === str.length-1){
return undefined;
}else{
for(var i = 0; i < str.length; i++){
if(str.charCodeAt(i+1) - str.charCodeAt(i) !== 1){
return String.fromCharCode(str.charCodeAt(i)+1);
}
}
}
}
10.Sorted Union
写一个 function,传入两个或两个以上的数组,返回一个以给定的原始数组排序的不包含重复值的新数组。
换句话说,所有数组中的所有值都应该以原始顺序被包含在内,但是在最终的数组中不包含重复值。
非重复的数字应该以它们原始的顺序排序,但最终的数组不应该以数字顺序排序。
function uniteUnique(...arr) {
return arr.reduce(function(prev,next){
return prev.concat(next.filter(e => !prev.includes(e)));
});
}
12.Spinal Tap Case
将字符串转换为 spinal case。Spinal case 是 all-lowercase-words-joined-by-dashes 这种形式的,也就是以连字符连接所有小写单词。
function spinalCase(str) {
str = str.replace(/([a-z])([A-Z])/g, '$1 $2');
return str.replace(/\s|_/g, '-').toLowerCase();
}
13.Sum All Odd Fibonacci Numbers
给一个正整数num,返回小于或等于num的斐波纳契奇数之和。
斐波纳契数列中的前几个数字是 1、1、2、3、5 和 8,随后的每一个数字都是前两个数字之和。
例如,sumFibs(4)应该返回 5,因为斐波纳契数列中所有小于4的奇数是 1、1、3。
提示:此题不能用递归来实现斐波纳契数列。因为当num较大时,内存会溢出,推荐用数组来实现。
function sumFibs(num) {
var prev = 0, next = 1, n = 1, res = 0;
while(next <= num){
if(n % 2 !== 0){
res += n;
}
n = prev + next;
prev = next;
next = n;
}
return res;
}
14.Sum All Primes
求小于等于给定数值的质数之和。
只有 1 和它本身两个约数的数叫质数。例如,2 是质数,因为它只能被 1 和 2 整除。1 不是质数,因为它只能被自身整除。
给定的数不一定是质数。
function sumPrimes(num) {
var res = 0;
for(var n = 1; n <= num; n++){
for(var m = 2; m < n; m++){
if(n % m === 0){
break;
}
}
if(n === m){
res +=m;
}
}
return res;
}
15.Smallest Common Multiple
找出能被两个给定参数和它们之间的连续数字整除的最小公倍数。
范围是两个数字构成的数组,两个数字不一定按数字顺序排序。
例如对 1 和 3 —— 找出能被 1 和 3 和它们之间所有数字整除的最小公倍数。
function smallestCommons(arr) {
var temp = [];
var min = Math.min(arr[0],arr[1]);
var max = Math.max(arr[0],arr[1]);
for(var i = min; i <= max; i++) {
temp.push(i);
}
var gcd = function(a,b) {
return b ? gcd(b, a % b) : a;
};
return temp.reduce(function(prev,cur) {
return prev*cur/gcd(prev,cur);
});
}
17.Drop it
从前面删除数组第一个参数的元素,直到第二个参数返回true。
第二个参数func是一个函数,用于测试数组的第一个元素,以决定是否应该删除它。
返回数组的其余部分,否则返回一个空数组。
function dropElements(arr, func) {
return arr.slice(arr.findIndex(func) >= 0 ? arr.findIndex(func) : arr.length, arr.length);
}
18.Steamroller
对嵌套的数组进行扁平化处理。你必须考虑到不同层级的嵌套。
function steamrollArray(arr) {
return arr.reduce(function(prev, next){
return prev.concat(Array.isArray(next) ? steamrollArray(next) : next);
}, []);
}
19.Everything Be True
如果集合(collection)中的所有对象都存在对应的属性(pre),并且属性(pre)对应的值为真。函数返回ture。反之,返回false。
function truthCheck(collection, pre) {
return collection.every(function(e){
return e[pre];
});
}
20.Arguments Optional
创建一个计算两个参数之和的 function。如果只有一个参数,则返回一个 function,该 function 请求一个参数然后返回求和的结果。
例如,add(2, 3) 应该返回 5,而 add(2) 应该返回一个 function。
调用这个有一个参数的返回的 function,返回求和的结果:
var sumTwoAnd = add(2);
sumTwoAnd(3) 返回 5。
如果两个参数都不是有效的数字,则返回 undefined。
function addTogether() {
var args = Array.from(arguments);
return args.some(n => typeof n !== 'number') ? undefined
: args.length > 1 ?
args.reduce((prev, next) => prev += next, 0) : (n) => typeof n === "number" ?
n + args[0] : undefined;
}
addTogether(2,3);