今天高考结束了, 或许有些热爱代码的00后同学,看到网上公布的答案,开始估分,自已离985/211就差做错或少做一道题, 感觉没戏,来社区看代码来了。我在很多年前,考上的也是双非学校。虽然有一点怪自己懵懂暗恋上的女同桌在一个考场前后桌,在考场上发挥不佳,但是,每门功课,对偏难的题目,从不跃雷池一步,内心有些双非能力的设定, 不无关系。
即然已经工作写代码了, 还是写了多年前端的老司机,想给双非学校并在准备秋招的前端同学说一句,算法真的很重要,就像高考时,数学的最后一两道题,答对了,能进985/211,答不对,就是双非学校。而在秋招中, 算法题答不好,很难进名企。
leetcode正流行
且不说,宇宙条,前端面试考的是一堆算法题,腾讯/阿里,二面或三面有专门的算法在线笔试题。上半年,github最火的开源项目里,好几个leetcode相关的项目。随着leetcode越来越流行,留给前端实习同学过一遍排序算法,就能拿还不差公司offer的好日子怕是没有了。
-
leetcode题解 来自兑吧的lucifer, 之前也看他写的从零开始写一个webpack、200行代码实现 mini-React 等前端面试中等别有用的技术解析。作者以自己解leetcode 的思路和面试的考查点,解构了leetcode题库,非常推荐。
-
leetcode animation
来自程序员吴师兄, 3万+ start的神开源项目,正是它让对leetcode 的理解动画起来,并且带起来了leetcode学习风,不可错过。有了它,不会算法,是借口。 -
极客时间王争老师的数据结构与算法之美
要去名企,先去leetcode官网解题
面试及在线写代码,用牛客网, 我建议要高效学习,使用上各种学习神器及在线学习产品。因为大厂面试时, 为了提高效率, 直接或间接地采用了这些在线测试产品,同时,最重要的是,它让我们对于算法的学习,被记录下来, leetcode学习可以被证明。
有新意的leetcode学习方式分享
我想在这里, 给大家分享一份比较适合前端, 可视化, es6, 简单易上手的解题策略。
leetcode 86题链表分隔
链表分隔, 是一道数据结构链表的基础考查题,题目如下:
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
-
到leetcode Animation 看图解, 事实上, 大多数时候,我是跟着吴师兄,来解leetcode的题的。总能随着他的算法动画,get到算法的解题意图。
-
来自trekhleb
trekhleb的数据结构实现,非常nice, 强力推荐,我在刷leetcode 数据结构类题目时,使用trekhleb的代码来实现
结点代码
export default class LinkedListNode {
constructor(value, next = null) {
this.value = value;
this.next = next;
}
toString(callback) {
return callback ? callback(this.value) : `${this.value}`;
}
}
链表实现代码
import LinkedListNode from './LinkedListNode.js';
class LinkedList {
constructor() {
// 1->4->3->2->5->2
this.head = null;
this.tail = null;
}
append(value) {
const newNode = new LinkedListNode(value);
if (!this.head) { //空链表
this.head = newNode;
this.tail = newNode;
} else {
this.tail.next = newNode;
this.tail = newNode;
}
return this;
}
toArray () {
const nodes = [];
let currentNode = this.head;
while(currentNode) {
nodes.push(currentNode);
currentNode = currentNode.next;
}
return nodes;
}
toString() {
return this.toArray().map(node=>node.val);
}
}
export default LinkedList;
链表 由结点构成, 每个结点包含数据和指针,我在写这道题时, 在链表里仅实现了append 加子结点, toString 查看链表等方法。
- 在代码中, 做用了es6的模块化, 我使用了webpack 来编译代码, 让他跑起来, 并使用webpack-dev-server让他在浏览器中可视化整个学习的过程。我的webpack.config.js 的配置如下:
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
plugins: [
new HtmlWebpackPlugin({
filename: 'index.html', // 配置输出文件名和路径
template: 'src/index.html', // 配置文件模板
}),
],
devServer: {
port: '1314'
},
}
- 参照paopao2的代码实现了分隔链表
主要思路是分成小于某数的两个链表, 分开操作, 最后再合成链表的思路, 代码实现比较简单。
import LinkedList from './LinkedList';
// 实现一个链表
const partition = (head, x) => {
// 分成2个结点
let cur = head,
next,
preHead, //小于的
preTail,
afterHead, //大于或等于链表
afterTail;
if (head === null)
return null;
while (cur) { //一次遍历
next = cur.next;
cur.next = null; // 打掉以前的关系
if (cur.val < x) {
if (!preHead) { //空链表
preHead = cur;
preTail = cur;
} else {
preTail.next = cur;
preTail = cur;
}
} else {
if (!afterHead) { //空链表
afterHead = cur;
afterTail = cur;
} else {
afterTail.next = cur;
afterTail = cur;
}
}
cur = next;
}
if (preTail) {
preTail.next = afterHead;
return preHead;
} else {
return afterHead;
}
}
const list = new LinkedList();
// 1->4->3->2->5->2
list
.append(1)
.append(4)
.append(3)
.append(2)
.append(5)
.append(2)
// console.log(list.toString());
const newHead = partition(list.head, 3);
console.log(newHead);
let curNode = newHead;
while(curNode) {
console.log(curNode.val);
curNode = curNode.next;
}
总结
以上我主要将自己学习leetcode 的方式和参考的开源项目,分享给大家,希望对大家有所帮助, 谢谢。
网友评论