这是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 才返回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.创建两个参数之和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 就是一些片面的思考跟见解 不足以放到网上骗取吃瓜群众的眼光 多看看书在思考思考 在放出来吧
完结撒花~~~~