1席纽、區(qū)間求值算法(Sum All Numbers in a Range)
我們會(huì)傳遞給你一個(gè)包含兩個(gè)數(shù)字的數(shù)組纽疟。返回這兩個(gè)數(shù)字和它們之間所有數(shù)字的和瞎嬉。
最小的數(shù)字并非總在最前面蜕琴。
對(duì)你有幫助的資源:
Math.max() 函數(shù)返回一組數(shù)中的最大值挣轨。
Math.min() 函數(shù)返回一組數(shù)中的最小值串前。
//思路:先找出最大值和最小值瘫里,循環(huán)算和
function sumAll(arr) {
var sum = 0;
var min = Math.min(arr[0],arr[1]);
var max = Math.max(arr[0],arr[1]);
for(var i = min;i<=max;i++){
sum+=i;
}
return sum;
}
sumAll([1, 4]);
2、找出數(shù)組間差異算法(Diff Two Arrays)
比較兩個(gè)數(shù)組荡碾,然后返回一個(gè)新數(shù)組减宣,該數(shù)組的元素為兩個(gè)給定數(shù)組中所有獨(dú)有的數(shù)組元素。換言之玩荠,返回兩個(gè)數(shù)組的差異漆腌。
對(duì)你有幫助的資源:
Array.indexOf() 方法返回在數(shù)組中可以找到一個(gè)給定元素的第一個(gè)索引贼邓,如果不存在,則返回-1闷尿。
Array.concat() 方法用于合并兩個(gè)或多個(gè)數(shù)組塑径。此方法不會(huì)更改現(xiàn)有數(shù)組,而是返回一個(gè)新數(shù)組填具。
//思路:分別對(duì)比兩個(gè)數(shù)組中的元素统舀,不同的加入新數(shù)組中,然后將不同的元素連接成一個(gè)新數(shù)組
function diff(arr1, arr2) {
var newArr = [];
var arr3 = [];
for (var i=0;i<arr1.length;i++) {
if(arr2.indexOf(arr1[i]) === -1) //對(duì)比
arr3.push(arr1[i]);
}
var arr4 = [];
for (var j=0;j<arr2.length;j++) {
if(arr1.indexOf(arr2[j]) === -1) //對(duì)比
arr4.push(arr2[j]);
}
newArr = arr3.concat(arr4); //連接
// Same, same; but different.
return newArr;
}
diff([1, 2, 3, 5], [1, 2, 3, 4, 5]);
3劳景、數(shù)字轉(zhuǎn)羅馬數(shù)字(Roman Numeral Converter)
所有返回的 羅馬數(shù)字 都應(yīng)該是大寫形式誉简。
對(duì)你有幫助的資源:
Array.prototype.forEach() 方法對(duì)數(shù)組的每個(gè)元素執(zhí)行一次提供的函數(shù)。
//思路:將數(shù)字對(duì)應(yīng)的羅馬數(shù)字建立對(duì)應(yīng)的數(shù)組盟广,將數(shù)字?jǐn)?shù)組循環(huán)跟要轉(zhuǎn)化的數(shù)字進(jìn)行對(duì)比闷串,找出對(duì)應(yīng)區(qū)間對(duì)應(yīng)的羅馬數(shù)字
function convert(num) {
var nums = [1000,900,500,400,100,90,50,40,10,9,5,4,1];
var romans =["m","cm","d","cd","c","xc","l","xl","x","ix","v","iv","i"];
var str = '';
nums.forEach(function(item,index,array){ //循環(huán)對(duì)比要轉(zhuǎn)化的數(shù)字
while(num >= item){
str += romans[index]; //轉(zhuǎn)化成對(duì)應(yīng)的羅馬數(shù)字
num -= item;
}
});
return str.toUpperCase(); //全部轉(zhuǎn)化成大寫
}
convert(36);
4、對(duì)象搜索算法(Where art thou)
寫一個(gè) function筋量,它遍歷一個(gè)對(duì)象數(shù)組(第一個(gè)參數(shù))并返回一個(gè)包含相匹配的屬性-值對(duì)(第二個(gè)參數(shù))的所有對(duì)象的數(shù)組烹吵。如果返回的數(shù)組中包含 source 對(duì)象的屬性-值對(duì),那么此對(duì)象的每一個(gè)屬性-值對(duì)都必須存在于 collection 的對(duì)象中桨武。
例如肋拔,如果第一個(gè)參數(shù)是[{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }],第二個(gè)參數(shù)是{ last: "Capulet" }呀酸,那么你必須從數(shù)組(第一個(gè)參數(shù))返回其中的第三個(gè)對(duì)象萍程,因?yàn)樗俗鳛榈诙€(gè)參數(shù)傳遞的屬性-值對(duì)擅笔。
對(duì)你有幫助的資源:
Object.keys() 方法會(huì)返回一個(gè)由一個(gè)給定對(duì)象的自身可枚舉屬性組成的數(shù)組撕蔼,數(shù)組中屬性名的排列順序和使用 for...in 循環(huán)遍歷該對(duì)象時(shí)返回的順序一致 (兩者的主要區(qū)別是 一個(gè) for-in 循環(huán)還會(huì)枚舉其原型鏈上的屬性)靶庙。
語法
function where(collection, source) {
var arr = [];
var arrSource=Object.keys(source);//把source的屬性轉(zhuǎn)化為數(shù)組
var i='',j=0;
for(i in collection){//循環(huán)collection的元素
var count=0;
for(j=0;j<arrSource.length;j++){//針對(duì)source的屬性進(jìn)行循環(huán),查找這個(gè)collection元素中是否有指定的source的屬性
if(collection[i][arrSource[j]]&&source[arrSource[j]]==collection[i][arrSource[j]]){
count++;
}
}
//判斷:如果完全包含艾栋,這個(gè)collection的元素就被允許添加到里邊爆存。
if(count==arrSource.length){
arr.push(collection[i]);
}
}
return arr;
}
where([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });
5、查詢替換算法(Search and Replace)
使用給定的參數(shù)對(duì)句子執(zhí)行一次查找和替換蝗砾,然后返回新句子先较。
第一個(gè)參數(shù)是將要對(duì)其執(zhí)行查找和替換的句子。
第二個(gè)參數(shù)是將被替換掉的單詞(替換前的單詞)悼粮。
第三個(gè)參數(shù)用于替換第二個(gè)參數(shù)(替換后的單詞)闲勺。
注意:替換時(shí)保持原單詞的大小寫。例如扣猫,如果你想用單詞 "dog" 替換單詞 "Book" 菜循,你應(yīng)該替換成 "Dog"。
//思路:確定好了要替換的單詞和原來的單詞之后用replace方法直接替換
function myReplace(str, before, after) {
if(before[0] === before[0].toUpperCase()){ //如果原單詞大寫申尤,替換的單詞也要大寫
after = after[0].toUpperCase() + after.slice(1);
}
str = str.replace(before,after);
return str;
}
myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");
6癌幕、字符串移動(dòng)插入算法(Pig Latin)
把指定的字符串翻譯成 pig latin衙耕。
Pig Latin 把一個(gè)英文單詞的第一個(gè)輔音或輔音叢(consonant cluster)移到詞尾,然后加上后綴 "ay"勺远。
如果單詞以元音開始橙喘,你只需要在詞尾添加 "way" 就可以了。
對(duì)你有幫助的資源:
String.substr() 方法返回一個(gè)字符串中從指定位置開始到指定字符數(shù)的字符胶逢。
//思路:用indexOf方法判斷元素的第一個(gè)字母是不是元音厅瞎,如果是就直接加way,如果不是就用substr方法截取將第一個(gè)字母移到最后再加ay
function translate(str) {
var vowel = ["a", "e", "i", "o", "u"];
if (vowel.indexOf(str[0]) != -1) {
return str + "way";
}
while (vowel.indexOf(str[0]) == -1) {
str = str.substr(1) + str.substr(0, 1);
}
return str + "ay";
}
translate("consonant");
7初坠、字符配對(duì)算法(DNA Pairing)
DNA 鏈缺少配對(duì)的堿基和簸。依據(jù)每一個(gè)堿基,為其找到配對(duì)的堿基碟刺,然后將結(jié)果作為第二個(gè)數(shù)組返回锁保。
Base pairs(堿基對(duì)) 是一對(duì) AT 和 CG,為給定的字母匹配缺失的堿基南誊。
在每一個(gè)數(shù)組中將給定的字母作為第一個(gè)堿基返回。
例如蜜托,對(duì)于輸入的 GCG抄囚,相應(yīng)地返回 [["G", "C"], ["C","G"],["G", "C"]]
字母和與之配對(duì)的字母在一個(gè)數(shù)組內(nèi),然后所有數(shù)組再被組織起來封裝進(jìn)一個(gè)數(shù)組橄务。
對(duì)你有幫助的資源:
Array.prototype.map() 方法創(chuàng)建一個(gè)新數(shù)組幔托,其結(jié)果是該數(shù)組中的每個(gè)元素都調(diào)用一個(gè)提供的函數(shù)后返回的結(jié)果。
//思路:將字符串分割成數(shù)組蜂挪,然后將每一個(gè)元素進(jìn)行配對(duì)
function pair(str) {
var arr = str.split("");
var pair = '';
var result = arr.map(function(item,index,array){
switch(item){
case 'A':
pair = 'T';
break;
case 'T':
pair = 'A';
break;
case 'C':
pair = 'G';
break;
case 'G':
pair = 'C';
break;
}
return [item,pair];
});
return result;
}
pair("GCG");
8重挑、字符串查詢補(bǔ)充算法()
從傳遞進(jìn)來的字母序列中找到缺失的字母并返回它。
如果所有字母都在序列中棠涮,返回 undefined谬哀。
/*思路:
(1)如果傳進(jìn)來的不是一個(gè)按順序來的字母隊(duì)列,需要給他轉(zhuǎn)成鍵碼严肪,排序史煎,再轉(zhuǎn)化為字符串。這段是題目之外的要求驳糯。
(2)接下來查找字符串排序后在a-z中的索引篇梭,然后根據(jù)索引用substring切割出來,用以比較(strCompare)
(3)遍歷這個(gè)數(shù)組酝枢,找到?jīng)]有的恬偷,*/
function fearNotLetter(str) {
var arrCover=[];
for(var i=0;i<str.length;i++){
arrCover.push(str[i].charCodeAt());
}//轉(zhuǎn)化為鍵碼
arrCover.sort(function(a,b){
return a-b;
});//重新排序
str='';//清空
for(i=0;i<arrCover.length;i++){
str+=(String.fromCharCode(arrCover[i]));
}//把轉(zhuǎn)化出來的數(shù)組重新給字符串
//獲取索引
var strAll='abcdefghijklmnopqrstuvwxyz';
var indexOver=strAll.indexOf(str.charAt(str.length-1));
var indexStart=strAll.indexOf(str.charAt(0));
//切割出用以比較的字符串
var strCompare=strAll.substring(indexStart,indexOver+1);
var newStr='';
if(strCompare==str){
return undefined;
}
for(i=0;i<strCompare.length;i++){
if(str.indexOf(strCompare[i])==-1){
newStr+=strAll[i];
}
}
console.log(newStr);
return newStr;
}
fearNotLetter("abce");
9、輸入檢查算法(Boo who)
檢查一個(gè)值是否是基本布爾類型帘睦,并返回 true 或 false袍患。
function boo(bool){
return (typeof bool == 'boolean');
}
boo(null);
10坦康、數(shù)組去重算法(Sorted Union)
寫一個(gè) function,傳入兩個(gè)或兩個(gè)以上的數(shù)組协怒,返回一個(gè)以給定的原始數(shù)組排序的不包含重復(fù)值的新數(shù)組涝焙。
換句話說,所有數(shù)組中的所有值都應(yīng)該以原始順序被包含在內(nèi)孕暇,但是在最終的數(shù)組中不包含重復(fù)值仑撞。
非重復(fù)的數(shù)字應(yīng)該以它們?cè)嫉捻樞蚺判颍罱K的數(shù)組不應(yīng)該以數(shù)字順序排序妖滔。
這是一些對(duì)你有幫助的資源:
Arguments object
//思路:循環(huán)逐個(gè)進(jìn)行對(duì)比隧哮,符合條件的放入數(shù)組中
function unite(arr1, arr2, arr3) {
var newArr=[];
for(var i=1;i<arguments.length;i++){
for(var j=0;j<arguments[i].length;j++){
if(arguments[0].indexOf(arguments[i][j])==-1){
newArr.push(arguments[i][j]);
}
}
}
newArr=arguments[0].concat(newArr);
console.log(newArr);
return newArr;
}
unite([1, 3, 2], [5, 2, 1, 4], [2, 1]);
11、html符號(hào)轉(zhuǎn)實(shí)體算法(Convert HTML Entities)
將字符串中的字符&座舍、<沮翔、>、"(雙引號(hào)), 以及'(單引號(hào))轉(zhuǎn)換為它們對(duì)應(yīng)的 HTML 實(shí)體曲秉。
對(duì)你有幫助的資源:
HTML Entities
//思路:將數(shù)組分割成數(shù)組時(shí)候采蚀,每個(gè)元素進(jìn)行檢查,如果是符號(hào)就轉(zhuǎn)化成相應(yīng)的實(shí)體
function convert(str) {
var i=0;
var arr=str.split("");
for(i=0;i<arr.length;i++){
switch(arr[i]){
case '&':
arr.splice(i,1,'&');
break;
case '>':
arr.splice(i,1,'>');
break;
case '<':
arr.splice(i,1,'<');
break;
case "'":
arr.splice(i,1,''');
break;
case '"':
arr.splice(i,1,'"');
break;
}
}
str=arr.join('');
return str;
}
convert("Dolce & Gabbana");
12承二、字符串連接算法(Spinal Tap Case)
將字符串轉(zhuǎn)換為 spinal case榆鼠。Spinal case 是 all-lowercase-words-joined-by-dashes 這種形式的,也就是以連字符連接所有小寫單詞亥鸠。
function spinalCase(str) {
str=str.replace(/([A-Z]+)/g,' $1');//在大寫字母前面加個(gè)空格妆够。用$來選擇小括號(hào)
str=str.replace(/\s+|_+/g,'-');//空格全部替換為-
if(str[0]=='-'){
str=str.substring(1);
}//去掉可能大寫開頭前面的-
str=str.replace(/--/g,'-');//把中段的--(兩個(gè))替換為一個(gè)-。(因?yàn)橄聞澗€+大寫導(dǎo)致生成了兩個(gè)-)
str=str.toLowerCase();//轉(zhuǎn)換小寫
rn str;
}
spinalCase('This Is Spinal Tap')
spinalCase("This Is Spinal Tap") 應(yīng)該返回 "this-is-spinal-tap"负蚊。
spinalCase("thisIsSpinalTap") 應(yīng)該返回 "this-is-spinal-tap"神妹。
spinalCase("The_Andy_Griffith_Show") 應(yīng)該返回 "the-andy-griffith-show"。
spinalCase("Teletubbies say Eh-oh") 應(yīng)該返回 "teletubbies-say-eh-oh"家妆。
13鸵荠、斐波納契奇數(shù)求和算法(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)存會(huì)溢出缺虐,推薦用數(shù)組來實(shí)現(xiàn)。
參考文檔:博客園礁凡,Issue
function sumFibs(num) {
var fibo = [1, 1]; //定義數(shù)組高氮,存放奇數(shù)1
var oddSum = 2; //定義固定和為2
while(true){
var item = fibo[0] + fibo[1]; //
if(num < item){ //當(dāng)數(shù)字小于2的時(shí)候,直接返回2
return oddSum;
}
if(item % 2){ //算奇數(shù)顷牌,算和
oddSum += item;
}
fibo[0] = fibo[1];
fibo[1] = item;
}
}
sumFibs(4);
15剪芍、質(zhì)素求和算法(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 arr=[2];
var sum=0;
for(var i=2;i<=num;i++){
var bCheck=true;//假定為真
for(var j=0;j<arr.length;j++){//循環(huán)數(shù)組
if(i%arr[j]==0){//如果可以被質(zhì)數(shù)整除
bCheck=false;//判定為false
break;//退出循環(huán)谁帕,用不著繼續(xù)判斷了峡继。
}
}
if(bCheck){
arr.push(i);
}
}
console.log(arr);
for(var k=0;k<arr.length;k++){
sum+=arr[k];
}//求和
return sum;
}
sumPrimes(10);
16、最小公倍數(shù)算法(Smallest Common Multiple)
找出能被兩個(gè)給定參數(shù)和它們之間的連續(xù)數(shù)字整除的最小公倍數(shù)雇卷。
范圍是兩個(gè)數(shù)字構(gòu)成的數(shù)組鬓椭,兩個(gè)數(shù)字不一定按數(shù)字順序排序颠猴。
例如對(duì) 1 和 3 —— 找出能被 1 和 3 和它們之間所有數(shù)字整除的最小公倍數(shù)关划。
如果你被卡住了,記得開大招 Read-Search-Ask 翘瓮。嘗試與他人結(jié)伴編程贮折、編寫你自己的代碼。
對(duì)你有幫助的資源:
Smallest Common Multiple
/*思路:
(1)在此之前要了解歐拉算法求最大公約數(shù)资盅。
簡單的說调榄,求兩個(gè)數(shù)的最大公約數(shù),用大數(shù)對(duì)小數(shù)求模呵扛,如果能被整除每庆,則小數(shù)是這兩個(gè)數(shù)的最大公約數(shù)。
如果不能整除今穿,就用小數(shù)對(duì)余數(shù)再次求模缤灵,循環(huán)此過程直到返回能除盡的那個(gè)除數(shù)。就是最大公約數(shù)。
比如20和15腮出,用20除以15余數(shù)為5帖鸦,然后用15除以余數(shù)5,能夠整除胚嘲,所以返回出來的除數(shù)5為這兩個(gè)數(shù)的最大公約數(shù)作儿。
(2)有了最大公約數(shù),就可以求最小公倍數(shù)馋劈。
最小公倍數(shù)的求法是:彼此之間的乘積除以最大公約數(shù)攻锰。
因?yàn)槭乔髱讉€(gè)連續(xù)自然數(shù)之間的公倍數(shù),所以侣滩,求出前兩個(gè)最小公倍數(shù)之后口注,用這個(gè)最小公倍數(shù)和下一個(gè)值比較。
然后就得出了新的最小公倍數(shù)君珠。主要用的是遞歸的思想寝志。*/
function smallestCommons(arr) {
arr=arr.sort(function(a,b){
return a-b;
});
function fun(m,n){
if(m%n===0) return n;
return fun(n,m%n);
}
var num=arr[0];
for(var i=arr[0]+1;i<=arr[1];i++){
num*=i/fun(num,i);
}
return num;
}
smallestCommons([1,5]);
17、數(shù)組驗(yàn)證算法(Finders Keepers)
寫一個(gè) function策添,它遍歷數(shù)組 arr材部,并返回?cái)?shù)組中第一個(gè)滿足 func 返回值的元素。
舉個(gè)例子唯竹,如果 arr 為 [1, 2, 3]乐导,func 為 function(num) {return num === 2; },那么 find 的返回值應(yīng)為 2浸颓。
find([1, 3, 5, 8, 9, 10], function(num) { return num % 2 === 0; }) 應(yīng)該返回 8物臂。
find([1, 3, 5, 9], function(num) { return num % 2 === 0; }) 應(yīng)該返回 undefined。
//思路:這題相比前面的簡單很多了产上。注意:用break強(qiáng)制跳出循環(huán)棵磷。
function find(arr, func) {
var num = 0;
for(var i=0;i<arr.length;i++){
if(func(arr[i])===true){
num=arr[i];
break;
}
}
if(num===0){
return undefined;
}
return num;
}
find([1, 2, 3, 4], function(num){ return num % 2 === 0; });
18、數(shù)組取值算法(Drop it)
隊(duì)友該賣就賣晋涣,千萬別舍不得仪媒。
當(dāng)你的隊(duì)伍被敵人包圍時(shí),你選擇拯救誰谢鹊、拋棄誰非常重要算吩,如果選擇錯(cuò)誤就會(huì)造成團(tuán)滅。
如果是AD或AP佃扼,優(yōu)先拯救偎巢。
因?yàn)锳D和AP是隊(duì)伍輸出的核心。
其次應(yīng)該拯救打野兼耀。
因?yàn)榇蛞八懒藢?duì)面就可以無所顧慮地打龍压昼。
最后才是輔助或上單挎扰。
因?yàn)檩o助和上單都是肉,死了也不會(huì)對(duì)團(tuán)隊(duì)造成毀滅性影響巢音,該賣就賣遵倦。
但真實(shí)中的團(tuán)戰(zhàn)遠(yuǎn)比這要復(fù)雜,你的隊(duì)伍很可能會(huì)被敵人分割成2個(gè)或3個(gè)部分官撼。
當(dāng)你救了一個(gè)重要的人時(shí)梧躺,很可能其他隊(duì)友也會(huì)因此獲救。
舉個(gè)例子:
輔助和AD經(jīng)常是在一起的傲绣,打野和中單在一起掠哥,上單經(jīng)常一個(gè)人。
你救了AD秃诵,輔助也經(jīng)常因此獲救续搀。
讓我們來丟棄數(shù)組(arr)的元素,從左邊開始菠净,直到回調(diào)函數(shù)return true就停止禁舷。
第二個(gè)參數(shù),func毅往,是一個(gè)函數(shù)牵咙。用來測(cè)試數(shù)組的第一個(gè)元素,如果返回fasle攀唯,就從數(shù)組中拋出該元素(注意:此時(shí)數(shù)組已被改變)洁桌,繼續(xù)測(cè)試數(shù)組的第一個(gè)元素,如果返回fasle侯嘀,繼續(xù)拋出另凌,直到返回true。
最后返回?cái)?shù)組的剩余部分戒幔,如果沒有剩余吠谢,就返回一個(gè)空數(shù)組。
//思路:遍歷這個(gè)數(shù)組溪食,然后用func判斷返回的是布爾值囊卜,根據(jù)布爾值插入一個(gè)占位的字符串‘false’娜扇。待循環(huán)結(jié)束之后用filter過濾掉就行了错沃。
function drop(arr, func) {
// Drop them elements.
for(var i=0;i<arr.length;i++){
if(func(arr[i])===false){
arr.splice(i,1,'false');
}else{
break;
}
}
arr=arr.filter(function(a){
return a!='false';
});
console.log(arr);
return arr;
}
drop([1, 2, 3], function(n) {return n < 3; });
19、數(shù)組簡化算法(Steamroller)
對(duì)嵌套的數(shù)組進(jìn)行扁平化處理雀瓢。你必須考慮到不同層級(jí)的嵌套枢析。
steamroller([[["a"]], [["b"]]]) 應(yīng)該返回 ["a", "b"]。
steamroller([1, [2], [3, [[4]]]]) 應(yīng)該返回 [1, 2, 3, 4]刃麸。
steamroller([1, [], [3, [[4]]]]) 應(yīng)該返回 [1, 3, 4]醒叁。
steamroller([1, {}, [3, [[4]]]]) 應(yīng)該返回 [1, {}, 3, 4]。
//思路:還是用遞歸的辦法。判斷數(shù)組用isArray把沼。算是遞歸方法的簡單實(shí)例啊易。
function steamroller(arr) {
// I'm a steamroller, baby
var newArr=[];
function fun(a){
for(var j=0;j<a.length;j++){
if(Array.isArray(a[j])===true){
fun(a[j]);
}else{
newArr.push(a[j]);
}
}
return newArr;
}
fun(arr);
console.log(newArr);
return newArr;
}
steamroller([1, [2], [3, [[4]]]]);
20、二進(jìn)制轉(zhuǎn)字符算法(Binary Agents)
傳入二進(jìn)制字符串饮睬,翻譯成英語句子并返回租谈。
二進(jìn)制字符串是以空格分隔的。
function binaryAgent(str) {
var arr=str.split(' ');
var arr10=[];
var newStr='';
for(var i=0;i<arr.length;i++){
arr10.push(parseInt(arr[i],2));
}
for(var j=0;j<arr10.length;j++){
newStr+=String.fromCharCode(arr10[j]);
}
return newStr;
}
binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111");
21捆愁、數(shù)組元素判斷算法(Everything Be True)
所有的東西都是真的割去!
完善編輯器中的every函數(shù),如果集合(collection)中的所有對(duì)象都存在對(duì)應(yīng)的屬性(pre)昼丑,并且屬性(pre)對(duì)應(yīng)的值為真呻逆。函數(shù)返回ture。反之菩帝,返回false咖城。
記住:你只能通過中括號(hào)來訪問對(duì)象的變量屬性(pre)呼奢。
提示:你可以有多種實(shí)現(xiàn)方式酒繁,最簡潔的方式莫過于Array.prototype.every()。
//思路:這個(gè)看起來很復(fù)雜控妻,其實(shí)只要做個(gè)json的for-in循環(huán)州袒,就可以實(shí)現(xiàn)。
function every(collection, pre) {
var i='';
var bCheck=true;//假設(shè)為真
for(i in collection){
if(!collection[i][pre]){
bCheck=false;
}
}
return bCheck;
}
every([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}, {"user": "Laa-Laa", "sex": "female"}, {"user": "Po", "sex": "female"}], "sex");
22弓候、函數(shù)迭代可選參數(shù)算法(Arguments Optional)
創(chuàng)建一個(gè)計(jì)算兩個(gè)參數(shù)之和的 function郎哭。如果只有一個(gè)參數(shù),則返回一個(gè) function菇存,該 function 請(qǐng)求一個(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。
對(duì)你有幫助的資源:
Closures 閉包
/*思路:這個(gè)其實(shí)就是call()方法衣吠。jquery的鏈?zhǔn)讲僮骶褪沁@樣實(shí)現(xiàn)的茶敏。
函數(shù)鏈?zhǔn)讲僮髟恚悍祷睾瘮?shù)本身。當(dāng)然也可以返回一個(gè)別的函數(shù)缚俏。
function show(str){
alert(str);
return show;//關(guān)鍵
}
show('abc')('bcd')惊搏;
上述代碼將彈出兩個(gè)框贮乳,abc,和bcd恬惯。只要你想向拆,可以無限地寫下去。
你可以返回一個(gè)函數(shù)酪耳,那么下次操作時(shí)亲铡,得到的就是這個(gè)函數(shù)。*/
function add(x) {
if (arguments.length === 1 && typeof x === "number") {
return function (y) {
if (typeof y === "number"){
return x + y;
}
};
}else {
if (typeof x !== "number"|| typeof arguments[1] !== "number") {
return undefined;
}
return arguments[0] + arguments[1];
}
}
add(2,3);