堅(jiān)持又把FCC中級算法刷了一遍股囊,很有價(jià)值。尤其是很多思維方式的提升床玻,以及正則的運(yùn)用也更加熟練毁涉。題目又點(diǎn)多21道。不一定全寫锈死,因?yàn)橛械念}太簡單贫堰,也沒有什么知識點(diǎn)可講穆壕。但序號還說按照題目本身來給,望見諒其屏。(解析也不想寫喇勋,怪自己太懶...)有疑惑歡迎留言喔!
2.Diff Two Arrays
比較兩個(gè)數(shù)組偎行,然后返回一個(gè)新數(shù)組川背,該數(shù)組的元素為兩個(gè)給定數(shù)組中所有獨(dú)有的數(shù)組元素。換言之蛤袒,返回兩個(gè)數(shù)組的差異熄云。
["andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"] 應(yīng)該返回 ["diorite", "pink wool"] [1, "calf", 3, "piglet"], [1, "calf", 3, 4] 應(yīng)該返回 ["piglet", 4]
//解析:把兩個(gè)數(shù)組先合并,過濾掉原數(shù)組都存在的元素
function diffArray(arr1,arr2) {
return arr1.concat(arr2).filter(e => !(arr1.includes(e) && arr2.includes(e)));
}
3.Roman Numeral Converter
將給定的數(shù)字轉(zhuǎn)換成羅馬數(shù)字
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
寫一個(gè) function妙真,它遍歷一個(gè)對象數(shù)組(第一個(gè)參數(shù))并返回一個(gè)包含相匹配的屬性-值對(第二個(gè)參數(shù))的所有對象的數(shù)組缴允。如果返回的數(shù)組中包含 source 對象的屬性-值對,那么此對象的每一個(gè)屬性-值對都必須存在于 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
使用給定的參數(shù)對句子執(zhí)行一次查找和替換练般,然后返回新句子。
第一個(gè)參數(shù)是將要對其執(zhí)行查找和替換的句子锈候。
第二個(gè)參數(shù)是將被替換掉的單詞(替換前的單詞)薄料。
第三個(gè)參數(shù)用于替換第二個(gè)參數(shù)(替換后的單詞)。
注意:替換時(shí)保持原單詞的大小寫泵琳。例如摄职,如果你想用單詞 "dog" 替換單詞 "Book" ,你應(yīng)該替換成 "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
把一個(gè)英文單詞的第一個(gè)輔音或輔音叢(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
從傳遞進(jìn)來的字母序列中找到缺失的字母并返回它。
如果所有字母都在序列中且改,返回 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
寫一個(gè) function,傳入兩個(gè)或兩個(gè)以上的數(shù)組又跛,返回一個(gè)以給定的原始數(shù)組排序的不包含重復(fù)值的新數(shù)組碍拆。
換句話說,所有數(shù)組中的所有值都應(yīng)該以原始順序被包含在內(nèi),但是在最終的數(shù)組中不包含重復(fù)值感混。
非重復(fù)的數(shù)字應(yīng)該以它們原始的順序排序端幼,但最終的數(shù)組不應(yīng)該以數(shù)字順序排序。
function uniteUnique(...arr) {
return arr.reduce(function(prev,next){
return prev.concat(next.filter(e => !prev.includes(e)));
});
}
12.Spinal Tap Case
將字符串轉(zhuǎn)換為 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
給一個(gè)正整數(shù)num庭呜,返回小于或等于num的斐波納契奇數(shù)之和滑进。
斐波納契數(shù)列中的前幾個(gè)數(shù)字是 1、1募谎、2扶关、3、5 和 8近哟,隨后的每一個(gè)數(shù)字都是前兩個(gè)數(shù)字之和驮审。
例如,sumFibs(4)應(yīng)該返回 5吉执,因?yàn)殪巢{契數(shù)列中所有小于4的奇數(shù)是 1、1地来、3戳玫。
提示:此題不能用遞歸來實(shí)現(xiàn)斐波納契數(shù)列。因?yàn)楫?dāng)num較大時(shí)未斑,內(nèi)存會溢出咕宿,推薦用數(shù)組來實(shí)現(xiàn)。
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
求小于等于給定數(shù)值的質(zhì)數(shù)之和蜡秽。
只有 1 和它本身兩個(gè)約數(shù)的數(shù)叫質(zhì)數(shù)府阀。例如,2 是質(zhì)數(shù)芽突,因?yàn)樗荒鼙?1 和 2 整除试浙。1 不是質(zhì)數(shù),因?yàn)樗荒鼙蛔陨碚?br> 給定的數(shù)不一定是質(zhì)數(shù)寞蚌。
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
找出能被兩個(gè)給定參數(shù)和它們之間的連續(xù)數(shù)字整除的最小公倍數(shù)田巴。
范圍是兩個(gè)數(shù)字構(gòu)成的數(shù)組,兩個(gè)數(shù)字不一定按數(shù)字順序排序挟秤。
例如對 1 和 3 —— 找出能被 1 和 3 和它們之間所有數(shù)字整除的最小公倍數(shù)壹哺。
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
從前面刪除數(shù)組第一個(gè)參數(shù)的元素,直到第二個(gè)參數(shù)返回true艘刚。
第二個(gè)參數(shù)func是一個(gè)函數(shù)管宵,用于測試數(shù)組的第一個(gè)元素,以決定是否應(yīng)該刪除它。
返回?cái)?shù)組的其余部分箩朴,否則返回一個(gè)空數(shù)組岗喉。
function dropElements(arr, func) {
return arr.slice(arr.findIndex(func) >= 0 ? arr.findIndex(func) : arr.length, arr.length);
}
18.Steamroller
對嵌套的數(shù)組進(jìn)行扁平化處理。你必須考慮到不同層級的嵌套隧饼。
function steamrollArray(arr) {
return arr.reduce(function(prev, next){
return prev.concat(Array.isArray(next) ? steamrollArray(next) : next);
}, []);
}
19.Everything Be True
如果集合(collection)中的所有對象都存在對應(yīng)的屬性(pre)沈堡,并且屬性(pre)對應(yīng)的值為真。函數(shù)返回ture燕雁。反之诞丽,返回false。
function truthCheck(collection, pre) {
return collection.every(function(e){
return e[pre];
});
}
20.Arguments Optional
創(chuàng)建一個(gè)計(jì)算兩個(gè)參數(shù)之和的 function拐格。如果只有一個(gè)參數(shù)僧免,則返回一個(gè) function,該 function 請求一個(gè)參數(shù)然后返回求和的結(jié)果捏浊。
例如懂衩,add(2, 3) 應(yīng)該返回 5,而 add(2) 應(yīng)該返回一個(gè) function金踪。
調(diào)用這個(gè)有一個(gè)參數(shù)的返回的 function浊洞,返回求和的結(jié)果:
var sumTwoAnd = add(2);
sumTwoAnd(3) 返回 5。
如果兩個(gè)參數(shù)都不是有效的數(shù)字胡岔,則返回 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);