每天一个js小算法(日更 21天) - V 2.0

这是Verse 2 第一篇在每天一个js小算法(日更 21天) 是FCC的基础算法部分 这篇则是进阶算法 有点难度估计会花点时间

没有看第一篇的同学(吃瓜不明真相的群众) 可以点进去观看(链接如上) 如果懒 我再把它在贴出来

开始找有没有可以学习或者练习基本算法的学习平台或者课程
有很多推荐的我就例举几个 其他的请各位自行百度

首选 其他
- CodeWar codewar - Leecode Leecode很多大神都用这个去刷题 我只是听说但从未刷过一道题
- FCC freecodecamp - 考研的同学刷机试题 牛客 求职的同学还可以刷面试题 很牛皮

有哪些学习算法的网站推荐?
另外看到了其他几个听说超级有用不知真假
geeksforgeeks
一个小学生的算法竞赛题库
Lintcode 这个我逛了逛也可以的
看了以上几个网站以及回答 我选择了之前写过一些东西的FCC 因为都是基础的 也不想一步登天且这种白日梦不存在的 so 脚踏实地的开始

规则如下:

  1. 如果当天不完成或者各种理由推拖了 次日补
  2. 不能找答案(原则性问题不得触犯) 没能做出来或实现时间影响了日常工作 作为标记跳过 以后再来刷
  3. 解决思路+代码注释
    if 但凡是触犯了以上任意规则 自动退出 不在更新 发朋友圈一张自己最丑的图且截图放到此Blog (女人...不对...男人就要对自己狠一点)

不求数量 但求质量

为了以后写代码顺畅些 没别的愿景 因为一旦卡住我脑子就会陷入一种很难描述的情况
抓狂+1000个黑人问号脸 => 百度 => change code =>百度 的死循环
每次都是到了第二天脑子顺畅的时候一会儿就实现了 这种现象我表示很迷

7月30日

12:13:42 早晨一直看书(js语言精粹)到刚刚 因为今天老板不在 一刻不停歇的看书 就担心他回来开会 又是一堆需求没办法学习了(这样说是不是太装逼 会被打) 书上知识点同时我会更新到另一篇blog js语言精粹 正在看刚到一半儿

  1. 实现两个数字之间所有数字的和
    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()方法没做 对 就是因为懒

  1. 两个数组做差 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的方法底层实现源码

  1. 数字转换成罗马数字 这个先放一放 等有思路了在来
    indexOf() splice() join()
    Roman Numeral Converter

  1. **** 这个没看懂 我.....
    indexOf() splice() join()
    Where art thou

  1. 替换字符串中指定字符 看参数 即可明白 终于有一个能做了🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔
    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

  1. 把指定的字符串翻译成 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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;");
  }
convert("Dolce & Gabbana");

// 这个是另一种思路 对象~~~
function convert(str) {
  var obj={
    "&":'&amp;',
    '<':'&lt;',
    '>':'&gt;',
    '"':'&quot;',
    "'":'&apos;'
  };
  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 就是一些片面的思考跟见解 不足以放到网上骗取吃瓜群众的眼光 多看看书在思考思考 在放出来吧

完结撒花~~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容

  • 友情提示:此博客较长 需要您8-12分钟时间阅读 有FCC的初级算法题 和 一些有的没的分享另外中级篇 每天一个j...
    zz77zz阅读 17,053评论 20 119
  • FCC:GitHub - FreeCodeCamp/FreeCodeCamp: The https://FreeC...
    不要吧我再睡会阅读 1,381评论 4 8
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,152评论 0 4
  • 天灯挂田间, 寒气袭人面。 四周凄寂寂, 唯有水潺潺。 无名词 冷风钻袖,对红霞晚。夕阳消得一瞬间。独立田垅施肥水...
    明静说阅读 345评论 0 1
  • 夜渐渐地黑下来,院子里站满了一堆堆的人群。人声鼎沸,他们在不住地吵闹着什么,让刚刚从外面回来的若停下了脚步。竖起耳...
    丽莎老师阅读 593评论 2 1