freecodecamp高級算法題(個人解法)

Validate US Telephone Numbers

檢查是否是美國電話號碼贡蓖。其中有很多變體寫法曹鸠,也要求返回正確。

functiontelephoneCheck(str){vara = str.match(/[0-9]/g).length;varb = str.match(/^(?:(?:\(\d{3}\)|\d{3})[\s|-]?\d{3}[\s|-]?\d{4}$)/);varc = str.match(/(?:\(\d{3}\)|\d{3})[\s|-]?\d{3}[\s|-]?\d{4}$/);vard = str.match(/^1[^0-9]/);if(a ===10&& b !==null) {returntrue;? ? }elseif(a ===11&& c !==null&& d !==null) {returntrue;? ? }returnfalse;}telephoneCheck("2 757 622-7382");

本來嘗試使用一個正則直接得出結果斥铺,很可惜受限于水平原因彻桃,最后放棄了嘗試。

最后的代碼里面仅父,通過a檢查傳入字符串中有多少個數(shù)字叛薯,在后面的if條件判斷中,分兩種情況(是否帶有國家代碼)來判斷笙纤。

值b用來匹配不帶國家代碼的電話號碼耗溜,前面的部分較后面來說比較復雜。需要匹配三個數(shù)字及三個數(shù)字加括號這兩種情況省容,但一邊單括號應當不能通過驗證抖拴。(?:(\d{3})|\d{3})這里,使用(?:)非捕獲括號,里面用 | 做了一個條件判斷阿宅,從而達到匹配三個數(shù)字或三個數(shù)字加括號這兩種情況候衍。前面的^用來防止匹配到帶國家代碼的電話(如果把b匹配放入if內(nèi),可以去掉這個^洒放,因為已經(jīng)通過a的數(shù)值判斷了是否帶國家代碼)蛉鹿。

值c和值b沒什么區(qū)別。

值d用來匹配國家代碼開頭部分(應該可以和c合并往湿,當時只為通關也就沒改了)妖异。

Symmetric Difference

接受兩個或者多個數(shù)組。如果是兩個數(shù)組领追,互相判定差集他膳,把結果作為一個集合輸出。如果是多個數(shù)組绒窑,用上一次的結果作為其中一個數(shù)組棕孙,和下一個做相同的操作(就是reduce啦)。

functionsym1(a, b){varc = [];for(variina) {if(b.indexOf(a[i]) ===-1) {? ? ? ? ? ? c.push(a[i]);? ? ? ? }? ? }for(varyinb) {if(a.indexOf(b[y]) ===-1) {? ? ? ? ? ? c.push(b[y]);? ? ? ? }? ? }returnc;}functionsym(args){vard = [];for(variinarguments) {? ? ? ? d.push(arguments[i]);? ? }vare = d.reduce(sym1);varf = [e[0]];for(vari =1; i < e.length; i++) {if(e[i] !== e[i -1]) {? ? ? ? ? ? f.push(e[i]);? ? ? ? }? ? }returnf;}sym([1,2,3], [5,2,1,4]);

先寫了一個reduce用的函數(shù)smy1些膨。用indexOf判斷元素是否在集合中蟀俊,如果不存在就放入準備好的結果容器c中。

接下來在主函數(shù)中用for循環(huán)arguments取出輸入的所有數(shù)組傀蓉,再使用reduce依次對等差分欧漱。注意這時如果輸入的數(shù)組中有多個重復的值职抡,而這個值滿足差分的要求葬燎,結果的數(shù)組中也會出現(xiàn)很多個相同的值。但是網(wǎng)站左側(cè)給出的例子要求我們不能出現(xiàn)重復缚甩,因此用一個for循環(huán)進行去重谱净。

Exact Change

寫一個收銀程序。

function checkCashRegister(price, cash, cid) {? ? var change;? ? var a =0;? ? var b = [];? ? var e = cash - price;? ? var d = [0.01,0.05,0.10,0.25,1,5,10,20,100];? ? for (var i in cid) {? ? ? ? a += cid[i][1];? ? }? ? if ((cash - price) > a) {? ? ? ? return 'Insufficient Funds';? ? } else if ((cash - price) === a) {? ? ? ? return 'Closed';? ? }? ? for (var i = d.length -1; i >=0; i--) {? ? ? ? if (i ===0&& e <= cid[i][1]) {? ? ? ? ? ? b.push([cid[i][0], Math.round(e *100) /100]);? ? ? ? ? ? e =0;? ? ? ? } else if (e >= d[i] && e <= cid[i][1] && cid[i][1] >0) {? ? ? ? ? ? b.push([cid[i][0], Math.floor(e / d[i]) * d[i]]);? ? ? ? ? ? e = e - Math.floor(e / d[i]) * d[i];? ? ? ? } else if (e >= d[i] && e >= cid[i][1] && cid[i][1] >0) {? ? ? ? ? ? b.push(cid[i]);? ? ? ? ? ? e = e - cid[i][1];? ? ? ? }? ? ? ? if (e ===0) {? ? ? ? ? ? break;? ? ? ? }? ? }? ? if (e !==0) {? ? ? ? return 'Insufficient Funds';? ? }? ? return b;}sym([1,2,3], [5,2,1,4]);

第一個for循環(huán)不用看擅威,出現(xiàn)的原因只是代碼通過了就沒改壕探。

第二個for循環(huán)是核心代碼。我的思路是用for循環(huán)對大面額到小面額依次進行判斷郊丛。每次會操作兩個變量李请,一個是結果容器b(push進一個列表,包含面額厉熟,和剩余金額)导盅,一個是e(初始量是待找金額,每次循環(huán)如果面額和余額滿足要求揍瑟,從e中扣除一定的錢)白翻。如果循環(huán)中出現(xiàn)e=0的情況,用break語句跳出绢片,因為此時找零已經(jīng)完成滤馍。如果直到循環(huán)結束岛琼,e仍有剩余,說明錢找不開巢株。

感覺代碼還是亂槐瑞,有修改的余地。

Inventory Update

依照一個存著新進貨物的二維數(shù)組阁苞,更新存著現(xiàn)有庫存(在 arr1 中)的二維數(shù)組. 如果貨物已存在則更新數(shù)量 . 如果沒有對應貨物則把其加入到數(shù)組中随珠,更新最新的數(shù)量. 返回當前的庫存數(shù)組,且按貨物名稱的字母順序排列猬错。

functionupdateInventory(arr1, arr2){vara = [];for(variinarr1) {? ? ? ? a.push(arr1[i][1]);? ? }for(variinarr2) {if(a.indexOf(arr2[i][1]) !==-1) {? ? ? ? ? ? arr1[a.indexOf(arr2[i][1])][0] += arr2[i][0];? ? ? ? }else{? ? ? ? ? ? arr1.push(arr2[i]);? ? ? ? }? ? }? ? arr1 = arr1.sort(function(a, b){returna[1].charCodeAt(0) - b[1].charCodeAt(0);? ? });returnarr1;}

用for循環(huán)遍歷進貨窗看,用indexOf判斷進貨中貨物名稱是否已經(jīng)在庫存中存在,如果存在就更新貨物數(shù)量倦炒,不存在則直接把這個數(shù)組加入庫存显沈。

按貨物名稱排序我直接用在sort內(nèi)寫了一個匿名函數(shù),通過比較字母的ASCII大小排序逢唤。

No repeats please

把一個字符串中的字符重新排列生成新的字符串拉讯,返回新生成的字符串里沒有連續(xù)重復字符的字符串個數(shù).連續(xù)重復只以單個字符為準

例如, aab 應該返回 2 因為它總共有6中排列 (aab, aab, aba, aba, baa, baa), 但是只有兩個 (aba and aba)沒有連續(xù)重復的字符 (在本例中是 a).

function perms(str) {? ? var result = [];? ? var n =0;? ? var m =str.length;? ? var perm = function(str, n, m) {if(n === m -1) {? ? ? ? ? ? result.push(str.join(''));? ? ? ? }else{for(var i = n; i < m; i++) {str[i] = [str[n],str[n] =str[i]][0];? ? ? ? ? ? ? ? perm(str, n +1, m);str[i] = [str[n],str[n] =str[i]][0];? ? ? ? ? ? }? ? ? ? }? ? };? ? perm(str, n, m);returnresult;}function permAlone(str) {? ? var regex = /(.)\1+/g;str=str.split('');? ? var b = perms(str);? ? varfilter= b.filter(function(a) {return! a.match(regex);? ? });returnfilter.length;}

一開始當成一個數(shù)學題來做,想了很久鳖藕,發(fā)現(xiàn)其中要判斷的情況太多魔慷,寫出代碼要很多條件判斷。最后還是用全排列做了著恩。

我的全排列函數(shù)perms是用遞歸做的院尔。思路是,有一個可用字符集合喉誊,取出其中一個邀摆,放在首位,接著更新這個字符集(集合中去除這個放在首位的字符)伍茄,接著在新字符集中取出其中一個……不斷循環(huán)直至其中只有一個字符栋盹。在寫代碼的時候變了一下實現(xiàn)方式,變成首字符和它后面的每一個字符依次交換敷矫,第二個字符和它后面的每一個字符依次交換例获,直至遞歸出口(倒數(shù)第二個字符)。

注意里面的匿名函數(shù)里的閉包情況(遞歸中每一次重新調(diào)用自身曹仗,并沒有創(chuàng)建一個新的變量榨汤,它們都在操作同一個str,n整葡,m件余。所以交換完了要再把str還原。遞歸出口是把此時的str組裝成一個字符串。這個操作不僅有輸出格式上的考量啼器,還有一個原因是旬渠,既然操作的都是同一個str,那么push進數(shù)組的當然也是同一個str端壳,雖然它們身處數(shù)組告丢,但一直在隨著函數(shù)里的str的變化而變化。所以我們需要把每次遞歸出口的str順序固定下來损谦,組裝字符串相當于創(chuàng)建了一個新的字符串對象岖免,從而達到固定順序的作用)。

Friendly Date Ranges

functionmakeDates(str){vararr = [];? ? str = str.split(/[^\d*]/);for(vari in str) {? ? ? ? arr.push(parseInt(str[i],10));? ? }returnarr;}functionmakeFriendlyDates(arr){varmonth = ['','January','February','March','April','May','June','July','August','September','October','November','December'];vardays = [];vararray= [];for(varz =0; z <31; z++) {if(z >=10&& z <=20) {? ? ? ? ? ? days.push('th');? ? ? ? }else{if(z %10===1) {? ? ? ? ? ? ? ? days.push('st');? ? ? ? ? ? }elseif(z %10===2) {? ? ? ? ? ? ? ? days.push('nd');? ? ? ? ? ? }elseif(z %10===3) {? ? ? ? ? ? ? ? days.push('rd');? ? ? ? ? ? }else{? ? ? ? ? ? ? ? days.push('th');? ? ? ? ? ? }? ? ? ? }? ? }for(vari in arr) {array.push(makeDates(arr[i]));? ? }vara =array[1][0] -array[0][0];varb =array[1][1] -array[0][1];varc =array[1][2] -array[0][2];for(vary inarray) {array[y][0] = [array[y][2],array[y][2] =array[y][0]][0];array[y][0] = [array[y][1],array[y][1] =array[y][0]][0];? ? ? ? replace(array[y]);? ? }functionreplace(array){array[0] = month[array[0]];array[1] = String(array[1]) + days[array[1]];array[2] = String(array[2]);if(array.length ===3) {array[1] =array[1] +',';? ? ? ? }? ? }if(a *360+ b *30+ c >=360) {}elseif(a *360+ b *30+ c >30&&array[0][2] ==='2016') {array[1] =array[1].splice(0,2);array[0] =array[0].splice(0,2);? ? }elseif(a *360+ b *30+ c >30) {array[1] =array[1].splice(0,2);array[0] =array[0].splice(0,3);? ? }elseif(a *360+ b *30+ c >0) {array[1] = [array[1][1]];array[0] =array[0].splice(0,2);? ? }elseif(a ===0&& b ===0&& c ===0) {array= [array[0]];? ? }returnarray.map(function(a){returna.join(' ').replace(/,$/,'');? ? });}

把一大堆條件判斷從人類語言轉(zhuǎn)換成代碼照捡。颅湘。。栗精。闯参。。悲立。這就是我寫這題的感覺鹿寨,也許出題人的初衷不是這個?

Make a Person

varPerson =function(name){vara = [name.split(' ')[0], name.split(' ')[1]];this.getFirstName =function(){returna[0];? ? };this.getLastName =function(){returna[1];? ? };this.getFullName =function(){returna[0] +' '+ a[1];? ? };this.setFirstName =function(b){? ? ? ? a[0] = b;? ? };this.setLastName =function(b){? ? ? ? a[1] = b;? ? };this.setFullName =function(b){? ? ? ? a[0] = b.split(' ')[0];? ? ? ? a[1] = b.split(' ')[1];? ? };};varbob =newPerson('Bob Ross');bob.getFirstName();

匿名函數(shù)function(name)在類建立時就被調(diào)用薪夕,它用來建立一個類空間脚草,其中的內(nèi)容即是建立的類的內(nèi)容。變量a用一個數(shù)組來儲存和修改Firstname及Lastname(把function(name)傳遞進類空間的name給spilt成兩塊)原献,給屬性賦予匿名函數(shù)馏慨,通過閉包操作變量a。這六個函數(shù)大同小異嚼贡,精簡成一個的話熏纯,會非常簡潔,同時可以清晰地看到兩個要點粤策。第一是通過函數(shù)建立類,第二是閉包的使用误窖。

Map the Debris

返回一個數(shù)組叮盘,其內(nèi)容是把原數(shù)組中對應元素的平均海拔轉(zhuǎn)換成其對應的軌道周期.

functionorbitalPeriod(arr){varGM =398600.4418;varearthRadius =6367.4447;functionchange(avgAlt){varr = earthRadius + avgAlt;varb =Math.pow(r,3) / GM;varT =2*Math.PI *Math.pow(b,0.5);returnMath.round(T);? ? }varresult = [];for(variinarr) {vara = change(arr[i].avgAlt);vardict = {};? ? ? ? dict.name = arr[i].name;? ? ? ? dict.orbitalPeriod = a;? ? ? ? result.push(dict);? ? }returnresult;}

用代碼把數(shù)學公式算一下。外加一點點數(shù)據(jù)的取出霹俺。不太清楚為什么要放在高級算法里柔吼。

Pairwise

舉個例子:有一個能力數(shù)組[7,9,11,13,15],按照最佳組合值為20來計算丙唧,只有7+13和9+11兩種組合愈魏。而7在數(shù)組的索引為0,13在數(shù)組的索引為3,9在數(shù)組的索引為1培漏,11在數(shù)組的索引為2溪厘。

所以我們說函數(shù):pairwise([7,9,11,13,15],20) 的返回值應該是0+3+1+2的和,即6牌柄。

function pairwise(arr, arg) {varcount=0;varred=[];for(vari=0;i

題目下面的提示是reduce畸悬,我的思路里面沒有用到,自己嘗試用reduce想了一下珊佣,感覺有點阻力蹋宦。

我的思路,遍歷每個值咒锻,每次遍歷中再對目前值之后的值進行一次遍歷冷冗。目的是每個值和它之后所有的值匹配,如果它們的和等于目標值惑艇,則把下標累加到變量count上贾惦。題目中還有一個值得注意的點,就是當兩個值匹配后敦捧,它們便不會和其他值匹配了须板。這里我通過一個變量red,作為一個池子兢卵,來儲存已經(jīng)匹配過的變量的下標习瑰。再循環(huán)中先進行條件判斷,若取出的值不在池中才進行下一步匹配(使用continue來實現(xiàn)秽荤,continue:跳過次循環(huán)直接執(zhí)行下一次循環(huán)甜奄,也可以使用一個if,判斷條件里用&&把“求和是否滿足要求”及“下標是否在池中”連起來)窃款。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末课兄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子晨继,更是在濱河造成了極大的恐慌烟阐,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件紊扬,死亡現(xiàn)場離奇詭異蜒茄,居然都是意外死亡,警方通過查閱死者的電腦和手機餐屎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門檀葛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腹缩,你說我怎么就攤上這事屿聋】赵” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵润讥,是天一觀的道長转锈。 經(jīng)常有香客問我象对,道長,這世上最難降的妖魔是什么甫煞? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任抚吠,我火速辦了婚禮,結果婚禮上楷力,老公的妹妹穿的比我還像新娘萧朝。我一直安慰自己夏哭,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布何址。 她就那樣靜靜地躺著用爪,像睡著了一般胁镐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上希停,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音磁餐,去河邊找鬼阿弃。 笑死渣淳,一個胖子當著我的面吹牛伴箩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播棺蛛,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼旁赊,長吁一口氣:“原來是場噩夢啊……” “哼椅野!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起离福,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤妖爷,失蹤者是張志新(化名)和其女友劉穎鲸湃,沒想到半個月后暗挑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡垃它,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年国拇,在試婚紗的時候發(fā)現(xiàn)自己被綠了酱吝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片土思。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡忆嗜,死狀恐怖捆毫,靈堂內(nèi)的尸體忽然破棺而出绩卤,到底是詐尸還是另有隱情,我是刑警寧澤濒憋,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布跋炕,位于F島的核電站律适,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捂贿。R本人自食惡果不足惜厂僧,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一颜屠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧密浑,春花似錦粗井、人聲如沸浇衬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赞赖。三九已至冤灾,卻和暖如春前域,著一層夾襖步出監(jiān)牢的瞬間韵吨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留糠悼,地道東北人倔喂。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像班缰,于是被迫代替她去往敵國和親悼枢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容