每天一個js小算法(日更 21天) - V 2.0
这是Verse 2 第一篇在每天一个js小算法(日更 21天) 是FCC的基础算法部分 这篇则是进阶算法 有点难度估计会花点时间
没有看第一篇的同学(吃瓜不明真相的群众
) 可以点进去观看(链接如上
) 如果懒 我再把它在贴出来
开始找有没有可以学习或者练习基本算法的学习平台或者课程
有很多推荐的我就例举几个 其他的请各位自行百度
首选 | 其他 |
---|---|
- CodeWar codewar | - Leecode Leecode很多大神都用这个去刷题 我只是听说但从未刷过一道题 |
- FCC freecodecamp | - 考研的同学刷机试题 牛客 求职的同学还可以刷面试题 很牛皮 |
有哪些学习算法的网站推荐?
另外看到了其他几个听说超级有用不知真假
geeksforgeeks
一个小学生的算法竞赛题库
Lintcode 这个我逛了逛也可以的
看了以上几个网站以及回答 我选择了之前写过一些东西的FCC 因为都是基础的 也不想一步登天且这种白日梦不存在的 so 脚踏实地的开始
规则如下:
如果当天不完成或者各种理由推拖了 次日补
不能找答案(
原则性问题不得触犯
) 没能做出来或实现时间影响了日常工作 作为标记跳过 以后再来刷解决思路+代码注释
if 但凡是触犯了以上任意规则 自动退出 不在更新 发朋友圈一张自己最丑的图且截图放到此Blog
(女人...不对...男人就要对自己狠一点)
不求数量 但求质量
为了以后写代码顺畅些 没别的愿景 因为一旦卡住我脑子就会陷入一种很难描述的情况抓狂+1000个黑人问号脸 => 百度 => change code =>百度 的死循环
每次都是到了第二天脑子顺畅的时候一会儿就实现了 这种现象我表示很迷
7月30日
12:13:42
早晨一直看书(js语言精粹
)到刚刚 因为今天老板不在 一刻不停歇的看书 就担心他回来开会 又是一堆需求没办法学习了(这样说是不是太装逼 会被打
) 书上知识点同时我会更新到另一篇blog js语言精粹 正在看刚到一半儿
实现两个数字之间所有数字的和
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}
讲道理还是数学公式好事,但是用reduce()方法没做 对 就是因为懒
两个数组做差
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]);
还有一个麻烦一定的办法 将传的参数分别在做个循环然后塞进一个数组 并返回 其实一个道理 所以我觉得数组这些方法的底层实现跟我这个方法类似 所以 找找每个Array的方法底层实现源码
数字转换成罗马数字 这个先放一放 等有思路了在来
indexOf() splice() join()
Roman Numeral Converter
**** 这个没看懂 我.....
indexOf() splice() join()
Where art thou
替换字符串中指定字符 看参数 即可明白 终于有一个能做了??????????
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分成数组去做的有一点点麻烦
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码的转换来获得。
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");
今天就忙着新项目搭建和规划 基本没时间写 又来了一个项目 小程序的在线教育 双语的~~~又开始写小程序了
8-2
21:43
**现在人在深圳 老板带我一起来谈个项目 才拿到手机 手机码字太辛苦 早上突然要求我穿干净的衣服来 我呵呵了 平时不干净? 明天回去补…… **
11:00:57
1. 检查值是否是基本boolean 并返回 true or false
Boo Who
function boo(bool) { return typeof bool==='boolean'; } boo(null);
16:21:05
2.数组去重 且 返回给定数组的原始顺序排序
Sorted Union
function unite(arr1, arr2, arr3) { //类数组=>数组 var args = Array.from(arguments) //合并为一维数组 var arr = args.reduce((a,c)=> a.concat(c)); // 数组去重 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的中级过了,这个算法都进行了多少天了 该加快进度了 之前一直在写小程序 现在有时间了 之前废话太多 没效率 这次撸起袖子就是干
1.将字符串中的字符 &、<、>、" (双引号), 以及 ' (单引号)转换为它们对应的 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.将字符串转换为 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.求小于等于给定数值的质数之和。
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,它遍历数组 arr,并返回数组中第一个满足 func 返回值的元素。举个例子,如果 arr 为 [1, 2, 3],func 为 function(num) {return num === 2; },那么 find 的返回值应为 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) 完全归于今天状态不好 昨天没睡好 早上拉肚子等各种理由 看书 然后回来再想想 也许就想明白了 好多都不会 fuck
我有一个大胆的想法 就是每天统计自己写了多少代码 或者 不停的编程 所以我写了Bloging的突发奇想
2.规则讲述的模棱两可 什么卖队友了什么中单了 哈哈哈 直接看结果 如下
Drop it
drop([1, 2, 3, 4], function(n) {return n >= 3;}) 应该返回 [3, 4]。 drop([0, 1, 0, 1], function(n) {return n === 1;}) 应该返回 [1, 0, 1]。 drop([1, 2, 3], function(n) {return n > 0;}) 应该返回 [1, 2, 3]。 drop([1, 2, 3, 4], function(n) {return n > 5;}) 应该返回 []。 drop([1, 2, 3, 7, 4], function(n) {return n > 3;}) 应该返回 [7, 4]。 drop([1, 2, 3, 9, 2], function(n) {return n > 2;}) 应该返回 [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("结束循环~~~") } }) } catch (e) { if(e.message !=="结束循环~~~") 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.对嵌套的数组进行扁平化处理。你必须考虑到不同层级的嵌套。 这个就是两套 递归继续扁平化+判断是否是数组 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"]]])
很好 我又卡住了
过了半个小时我找到解决方案 就是用闭包
阮一峰大神 闭包
这个方法得记住以后写代码就得这么用闭包 经常遇到这种结构的代码 每次都会处理很久 把内部处理数组的部分也写成函数去处理 递归也好写
4.传入二进制字符串,翻译成英语句子并返回。parseInt
进制转换
Binary Agents
function binaryAgent(str) { //str-> array str = str.split(" ");//循环做进制转换 var new_str = str.map(function (item) { return parseInt(item, 2); }); var str1 = "";// 循环 返回使用指定的Unicode值序列创建的字符串 然后拼接字符串 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");
发现超级超级严重的问题
每题都没写注释 翻看就蛋疼了
5.完善编辑器中的every函数,如果集合(collection)中的所有对象都存在对应的属性(pre),并且属性(pre)对应的值为真。函数返回ture。反之,返回false。
Everything Be True
function every(collection,pre){//循环判断属性 for(var i in collection){ if(!collection[i][pre]){ return false; } } return true; }// 用array.every()方法 所有项都为true 才返回truefunction 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.创建两个参数之和func 如果只提供了一个参数,则返回一个函数,这个函数与原来的函数功能要一样 如果任何一个参数不是有效数字,则返回undefined
Arguments Optional
function add() { // 类数组=> 数组 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] // 参数是一个但是二次执行 返回函数 else //保留参数一的值 var first = args[0] //返回一个函数 把第二次执行需要的参数与第一次相加 return (b) => { if (Number.isFinite(b)) { return first + b; } else { return undefined; } }; } add(2)(3);
19:07:06
就这样中级算法题也完成了
这篇花的时间更久 相较于基础篇 这篇的难度要大一点 具体收获的还是翻阅百度书也好 还是有的
更多的是思考 思维方式上有了一丁点的转变 不会把东西想的那么复杂 简单化
最希望看到的画面
我今天一整天时间全用来刷这6道题了 不知道是不是属于浪费时间的行为
但是有些题找了很多方法 搜索查看了很多stuff 多少应该有点用吧
把一些基本的数组方法都过了一遍 起码会比以前快那么30s 也算是进步
其实当今社会的人 不会"慢下来" 基于求成 以一种急躁的心态想完成当前所做事情 结果往往都不尽人意 所以学会慢下来 告诉自己 踏踏实实一步一步来 那些所谓2个月学会 *** 都是浮云 骗无脑人群的 自己沉下来 别去思考学习资料全不全 会不会不够 视频质量还不好学了会不会有效果 看了之后才能做评判不是么 人家说错与对那是参照他们的情况和他们的思考方式 自己呢?所以还是踏踏实实的 沉住气 加油~~~自己之前写过一点东西 但是一直不好意思open it 就是一些片面的思考跟见解 不足以放到网上骗取吃瓜群众的眼光 多看看书在思考思考 在放出来吧
完结撒花~~~~
作者:zz77zz
链接:https://www.jianshu.com/p/15a633378071
共同學習,寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章