這是Verse 2 第一篇在每天一個js小算法(日更 21天) 是FCC的基礎(chǔ)算法部分 這篇則是進階算法 有點難度估計會花點時間
沒有看第一篇的同學(xué)(吃瓜不明真相的群眾
) 可以點進去觀看(鏈接如上
) 如果懶 我再把它在貼出來
開始找有沒有可以學(xué)習(xí)或者練習(xí)基本算法的學(xué)習(xí)平臺或者課程
有很多推薦的我就例舉幾個 其他的請各位自行百度
首選 | 其他 |
---|---|
- CodeWar codewar | - Leecode Leecode很多大神都用這個去刷題 我只是聽說但從未刷過一道題 |
- FCC freecodecamp | - 考研的同學(xué)刷機試題 判茄梗客 求職的同學(xué)還可以刷面試題 很牛皮 |
有哪些學(xué)習(xí)算法的網(wǎng)站推薦标锄?
另外看到了其他幾個聽說超級有用不知真假
geeksforgeeks
一個小學(xué)生的算法競賽題庫
Lintcode 這個我逛了逛也可以的
看了以上幾個網(wǎng)站以及回答 我選擇了之前寫過一些東西的FCC 因為都是基礎(chǔ)的 也不想一步登天且這種白日夢不存在的 so 腳踏實地的開始
規(guī)則如下:
- 如果當(dāng)天不完成或者各種理由推拖了 次日補
- 不能找答案(
原則性問題不得觸犯
) 沒能做出來或?qū)崿F(xiàn)時間影響了日常工作 作為標(biāo)記跳過 以后再來刷 - 解決思路+代碼注釋
if 但凡是觸犯了以上任意規(guī)則 自動退出 不在更新 發(fā)朋友圈一張自己最丑的圖且截圖放到此Blog
(女人...不對...男人就要對自己狠一點)
不求數(shù)量 但求質(zhì)量
為了以后寫代碼順暢些 沒別的愿景 因為一旦卡住我腦子就會陷入一種很難描述的情況
抓狂+1000個黑人問號臉 => 百度 => change code =>百度 的死循環(huán)
每次都是到了第二天腦子順暢的時候一會兒就實現(xiàn)了 這種現(xiàn)象我表示很迷
7月30日
12:13:42
早晨一直看書(js語言精粹
)到剛剛 因為今天老板不在 一刻不停歇的看書 就擔(dān)心他回來開會 又是一堆需求沒辦法學(xué)習(xí)了(這樣說是不是太裝逼 會被打
) 書上知識點同時我會更新到另一篇blog js語言精粹 正在看剛到一半兒
-
實現(xiàn)兩個數(shù)字之間所有數(shù)字的和
Sum All Numbers in a Range
function factorialize(num) {
if (num < 0) {
return -1;
} else if (num === 0 || num === 1) {
return 1;
} else {
return (num * factorialize(num - 1));
}
}
/*公式方法*/
function sumAll(arr) {
return (arr[0] + arr[1])*(Math.abs(arr[0] - arr[1]) + 1)/2; (a+b)×(b-a+1)÷2
}
講道理還是數(shù)學(xué)公式好事,但是用reduce()方法沒做 對 就是因為懶
-
兩個數(shù)組做差
python直接一個方法就搞定了
indexOf() slice() concat() filter()
Diff Two Arrays
function diff(arr1, arr2) {
return arr1.filter(function(v){
return arr2.indexOf(v)==-1;
}).concat(arr2.filter(function(v){
return arr1.indexOf(v)==-1;
}));
}
diff([1, 2, 3, 5], [1, 2, 3, 4, 5]);
還有一個麻煩一定的辦法 將傳的參數(shù)分別在做個循環(huán)然后塞進一個數(shù)組 并返回 其實一個道理 所以我覺得數(shù)組這些方法的底層實現(xiàn)跟我這個方法類似 所以 找找每個Array的方法底層實現(xiàn)源碼
-
數(shù)字轉(zhuǎn)換成羅馬數(shù)字 這個先放一放 等有思路了在來
indexOf() splice() join()
Roman Numeral Converter
- **** 這個沒看懂 我.....
indexOf() splice() join()
Where art thou
-
替換字符串中指定字符 看參數(shù) 即可明白 終于有一個能做了????????????????????
replace() splice() join()
Search and 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");
這個是最容易想到的 也有別的思路 但是我今天得早點回家 交房租~~~ F**K!!!
7月31日
09:18:30
昨天下班時間看了你有多久沒更新過簡歷了? 很有感觸 萬一自己以后想跳槽去好一點的公司不再小公司廝混自己單挑獨斗 簡歷必然是重要的 腦子里一直回想要不刷個面試題?要不寫個刷面試題的Blog潮峦? 算了,一個一個來太急反而適得其反 把眼前的stuff寫完然后在bb or yy
-
把指定的字符串翻譯成 pig latin 直到找到第一個元音 把第一個原因之前的str 截取并拼接到最后 str的第一個字符就是元音 str+"way" 這道題我竟然花了30分鐘 花了兩種方法 這個簡便一些也看著更順
另一種是我把str分成數(shù)組去做的有一點點麻煩
indexOf() split() join() push()
Pig Latin
function translate(str) {
var _yuan = ["a","e","i","o","u"];
if(_yuan.indexOf(str[0]) >= 0){
return str + "way";
}
while(_yuan.indexOf(str[0]) < 0){
str = str.substr(1) + str.substr(0,1);
}
return str + "ay";
}
translate("california");
// 2. 未完成~~~
function translate(str) {
var _yuan = ['a','e','i','o','u']
var new_arr = str.split("")
var ae = []
new_arr.forEach((item)=>{
if(_yuan.indexOf(item)!==-1){
ae.push(item)
}
})
console.log(new_arr.join("").substr(new_arr.indexOf(ae[0]))+"ay")
}
translate("california");
8月1日
09:57:40
1.字母序列中找到缺失的字母并返回它,如果所有字母都在序列中勇婴,返回 undefined
遍歷字符串忱嘹,如果前一個字符的ASCII碼不是后一個字符ASCII碼+1,就判斷為丟失字符耕渴,返回丟失的字符德谅。
丟失的字符只能通過ASCII碼的轉(zhuǎn)換來獲得。
charCodeAt() | fromCharCode()
Missing letters
function fearNotLetter(str) {
for(var i=0,len=str.length;i<len;i++){
var _tag= str.charCodeAt(i+1)-str.charCodeAt(i);
if(_tag>1){
return String.fromCharCode(str.charCodeAt(i)+1);
}
}
return undefined;
}
fearNotLetter("abce");
今天就忙著新項目搭建和規(guī)劃 基本沒時間寫 又來了一個項目 小程序的在線教育 雙語的~~~又開始寫小程序了
8-2
21:43
**現(xiàn)在人在深圳 老板帶我一起來談個項目 才拿到手機 手機碼字太辛苦 早上突然要求我穿干凈的衣服來 我呵呵了 平時不干凈萨螺? 明天回去補…… **
11:00:57
1. 檢查值是否是基本boolean 并返回 true or false
Boo Who
function boo(bool) {
return typeof bool==='boolean';
}
boo(null);
16:21:05
2.數(shù)組去重 且 返回給定數(shù)組的原始順序排序
Sorted Union
function unite(arr1, arr2, arr3) {
//類數(shù)組=>數(shù)組
var args = Array.from(arguments)
//合并為一維數(shù)組
var arr = args.reduce((a,c)=> a.concat(c));
// 數(shù)組去重
return arr.filter((item,index)=>arr.indexOf(item) === index)
}
unite([1, 3, 2], [5, 2, 1, 4], [2, 1]);
8 - 8
12:02:22
今天把Fcc的中級過了窄做,這個算法都進行了多少天了 該加快進度了 之前一直在寫小程序 現(xiàn)在有時間了 之前廢話太多 沒效率 這次擼起袖子就是干
1.將字符串中的字符 &愧驱、<、>椭盏、" (雙引號), 以及 ' (單引號)轉(zhuǎn)換為它們對應(yīng)的 HTML 實體组砚。
Convert HTML Entities
// 簡單粗暴法
function convert(str) {
return str.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'");
}
convert("Dolce & Gabbana");
// 這個是另一種思路 對象~~~
function convert(str) {
var obj={
"&":'&',
'<':'<',
'>':'>',
'"':'"',
"'":'''
};
var arr = str.split(" ");
var result = arr.map(function(val){
if(obj.hasOwnProperty(val)){
return obj[val];
}else{
return val;
}
});
return result.join("");
}
convert("Dolce & Gabbana");
2.將字符串轉(zhuǎn)換為 spinal case。Spinal case 是 all-lowercase-words-joined-by-dashes 這種形式的掏颊,也就是以連字符連接所有小寫單詞糟红。
Spinal Tap Case
// 這個只能用于有空格的
function spinalCase(str) {
return str.split(" ").map((item) => item.toLowerCase()).join("-")
}
spinalCase('ThisIsSpinalTap');
// 所以Fcc推薦用正則 還是用正則去寫吧
function spinalCase(str) {
str = str.replace(/_/g," ")
.replace(/([A-Z])/g," $1")
.replace(/^\s/,"")
.replace(/\s+/g,"-")
.toLowerCase();
return str;
}
spinalCase('This Is Spinal Tap');
3.求小于等于給定數(shù)值的質(zhì)數(shù)之和。
Sum All Primes
function sumPrimes(num) {
var sum=0;
for (var i = 2; i <= num; i++) {
var flag=true;
for(var j=2;j<i;j++){
if(i%j==0){
flag=false;
break;
}
}
if(flag) sum+=i;
}
return sum
}
sumPrimes(10)
8月9日
11:34:05
1.寫一個 function乌叶,它遍歷數(shù)組 arr盆偿,并返回數(shù)組中第一個滿足 func 返回值的元素。舉個例子准浴,如果 arr 為 [1, 2, 3]事扭,func 為 function(num) {return num === 2; },那么 find 的返回值應(yīng)為 2乐横。
Finders Keepers
// 第一種方案
function find(arr, func) {
var arr_n = arr.map((item)=>{
if(func(item)){
return item;
}
})
arr_n = arr_n.filter((item)=>{
return typeof(item)!='undefined'
})
return arr_n.length === 0 ? undefined : arr_n[0];
}
find([1, 3, 5, 8, 9, 10], function(num){ return num % 2 === 0; });
//第二種方案
function findElement(arr, func) {
let arr1 = arr.filter((val) => {
return func(val);
});
return arr1.length === 0 ? undefined : arr1[0];
}
14:47:34
我卡死在這里了 想了很久(吃飯+休息+上廁所) 終于..............?????????? 徹底沒了思路 很開心 撒花(mmp) 完全歸于今天狀態(tài)不好 昨天沒睡好 早上拉肚子等各種理由 看書 然后回來再想想 也許就想明白了 好多都不會 fuck
我有一個大膽的想法 就是每天統(tǒng)計自己寫了多少代碼 或者 不停的編程 所以我寫了Bloging的突發(fā)奇想
2.規(guī)則講述的模棱兩可 什么賣隊友了什么中單了 哈哈哈 直接看結(jié)果 如下
Drop it
drop([1, 2, 3, 4], function(n) {return n >= 3;}) 應(yīng)該返回 [3, 4]求橄。
drop([0, 1, 0, 1], function(n) {return n === 1;}) 應(yīng)該返回 [1, 0, 1]。
drop([1, 2, 3], function(n) {return n > 0;}) 應(yīng)該返回 [1, 2, 3]葡公。
drop([1, 2, 3, 4], function(n) {return n > 5;}) 應(yīng)該返回 []罐农。
drop([1, 2, 3, 7, 4], function(n) {return n > 3;}) 應(yīng)該返回 [7, 4]。
drop([1, 2, 3, 9, 2], function(n) {return n > 2;}) 應(yīng)該返回 [3, 9, 2]催什。
// 題要是這么簡單就好了 還有種情況沒考慮
//function drop(arr, func) {
// return arr.filter((item)=>{
// return func(item)
// })
//}
//drop([1, 2, 3], function(n) {return n < 3; });
function drop(arr, func) {
arr.map((item,index)=>{
if(!func(arr[index])){
return arr.splice(index,1,"nonono")
}
})
return arr.filter((item)=>{
return item !="nonono"
})
}
function drop(arr, func) {
try {
arr.forEach((item, index) => {
if (func(arr[index]) === false) {
arr.splice(index, 1, "nonono")
} else {
throw new Error("結(jié)束循環(huán)~~~")
}
})
} catch (e) {
if(e.message !=="結(jié)束循環(huán)~~~") throw e
}
return arr.filter((item) => {
return item != "nonono"
})
}
drop([0, 1, 0, 1], (n)=> {return n === 1})
跳出for break 但是跳出forEach 要用try catch okay了
3.對嵌套的數(shù)組進行扁平化處理涵亏。你必須考慮到不同層級的嵌套。 這個就是兩套 遞歸繼續(xù)扁平化+判斷是否是數(shù)組 let's do this
Steamroller
function steamroller(arr) {
var new_arr = []
function asdf(ifarr){
if(Array.isArray(ifarr)){
return ifarr.forEach((item)=>{return asdf(item)})
}else new_arr.push(ifarr)
}
asdf(arr)
return new_arr
}
steamroller([1, [2], [3, [[4]]]]);
steamroller([[["a"]], [["b"]]])
很好 我又卡住了??????????
過了半個小時我找到解決方案 就是用閉包
阮一峰大神 閉包
這個方法得記住以后寫代碼就得這么用閉包 經(jīng)常遇到這種結(jié)構(gòu)的代碼 每次都會處理很久 把內(nèi)部處理數(shù)組的部分也寫成函數(shù)去處理 遞歸也好寫
4.傳入二進制字符串蒲凶,翻譯成英語句子并返回气筋。
parseInt
進制轉(zhuǎn)換
Binary Agents
function binaryAgent(str) {
//str-> array
str = str.split(" ");
//循環(huán)做進制轉(zhuǎn)換
var new_str = str.map(function (item) {
return parseInt(item, 2);
});
var str1 = "";
// 循環(huán) 返回使用指定的Unicode值序列創(chuàng)建的字符串 然后拼接字符串 done
new_str.forEach(function (item) {
str1 += String.fromCharCode(item);
});
return str1;
}
binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111");
發(fā)現(xiàn)超級超級嚴重的問題
每題都沒寫注釋 翻看就蛋疼了
5.完善編輯器中的every函數(shù),如果集合(collection)中的所有對象都存在對應(yīng)的屬性(pre)豹爹,并且屬性(pre)對應(yīng)的值為真裆悄。函數(shù)返回ture矛纹。反之臂聋,返回false。
Everything Be True
function every(collection,pre){
//循環(huán)判斷屬性
for(var i in collection){
if(!collection[i][pre]){
return false;
}
}
return true;
}
// 用array.every()方法 所有項都為true 才返回true
function every(collection, pre) {
// Is everyone being true?
return collection.every(function(item,index,array){
return item[pre];
});
}
every([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}, {"user": "Laa-Laa", "sex": "female"}, {"user": "Po", "sex": "female"}], "sex");
這題還是好做一點 上一題花了點時間
17:56:20
6.創(chuàng)建兩個參數(shù)之和func 如果只提供了一個參數(shù)或南,則返回一個函數(shù)孩等,這個函數(shù)與原來的函數(shù)功能要一樣 如果任何一個參數(shù)不是有效數(shù)字,則返回undefined
Arguments Optional
function add() {
// 類數(shù)組=> 數(shù)組
var args = Array.prototype.slice.call(arguments);
//判斷是否是number
var result = args.every(function (item) {return Number.isFinite(item)})
if (result === false)
return undefined
else if (args.length === 2)
return args[0] + args[1]
// 參數(shù)是一個但是二次執(zhí)行 返回函數(shù)
else
//保留參數(shù)一的值
var first = args[0]
//返回一個函數(shù) 把第二次執(zhí)行需要的參數(shù)與第一次相加
return (b) => {
if (Number.isFinite(b)) {
return first + b;
} else {
return undefined;
}
};
}
add(2)(3);
19:07:06
就這樣中級算法題也完成了??????????
這篇花的時間更久 相較于基礎(chǔ)篇 這篇的難度要大一點 具體收獲的還是翻閱百度書也好 還是有的
更多的是思考 思維方式上有了一丁點的轉(zhuǎn)變 不會把東西想的那么復(fù)雜 簡單化
我今天一整天時間全用來刷這6道題了 不知道是不是屬于浪費時間的行為
但是有些題找了很多方法 搜索查看了很多stuff 多少應(yīng)該有點用吧
把一些基本的數(shù)組方法都過了一遍 起碼會比以前快那么30s 也算是進步
其實當(dāng)今社會的人 不會"慢下來" 基于求成 以一種急躁的心態(tài)想完成當(dāng)前所做事情 結(jié)果往往都不盡人意 所以學(xué)會慢下來 告訴自己 踏踏實實一步一步來 那些所謂2個月學(xué)會 *** 都是浮云 騙無腦人群的 自己沉下來 別去思考學(xué)習(xí)資料全不全 會不會不夠 視頻質(zhì)量還不好學(xué)了會不會有效果 看了之后才能做評判不是么 人家說錯與對那是參照他們的情況和他們的思考方式 自己呢采够?所以還是踏踏實實的 沉住氣 加油~~~
自己之前寫過一點東西 但是一直不好意思o(jì)pen it 就是一些片面的思考跟見解 不足以放到網(wǎng)上騙取吃瓜群眾的眼光 多看看書在思考思考 在放出來吧
完結(jié)撒花~~~~