今天高考結束了, 或許有些熱愛代碼的00後同窗,看到網上公佈的答案,開始估分,自已離985/211就差作錯或少作一道題, 感受沒戲,來社區看代碼來了。我在不少年前,考上的也是雙非學校。雖然有一點怪本身懵懂暗戀上的女同桌在一個考場先後桌,在考場上發揮不佳,可是,每門功課,對偏難的題目,從不躍雷池一步,心裏有些雙非能力的設定, 不無關係。javascript
即然已經工做寫代碼了, 仍是寫了多年前端的老司機,想給雙非學校並在準備秋招的前端同窗說一句,算法真的很重要,就像高考時,數學的最後一兩道題,答對了,能進985/211,答不對,就是雙非學校。而在秋招中, 算法題答很差,很難進名企。html
且不說,宇宙條,前端面試考的是一堆算法題,騰訊/阿里,二面或三面有專門的算法在線筆試題。上半年,github最火的開源項目裏,好幾個leetcode相關的項目。隨着leetcode愈來愈流行,留給前端實習同窗過一遍排序算法,就能拿還不差公司offer的好日子怕是沒有了。前端
面試及在線寫代碼,用牛客網, 我建議要高效學習,使用上各類學習神器及在線學習產品。由於大廠面試時, 爲了提升效率, 直接或間接地採用了這些在線測試產品,同時,最重要的是,它讓咱們對於算法的學習,被記錄下來, leetcode學習能夠被證實。java
我想在這裏, 給你們分享一份比較適合前端, 可視化, es6, 簡單易上手的解題策略。node
鏈表分隔, 是一道數據結構鏈表的基礎考查題,題目以下:webpack
給定一個鏈表和一個特定值 x,對鏈表進行分隔,使得全部小於 x 的節點都在大於或等於 x 的節點以前。你應當保留兩個分區中每一個節點的初始相對位置。git
輸入: head = 1->4->3->2->5->2, x = 3
輸出: 1->2->2->4->3->5
複製代碼
到leetcode Animation 看圖解, 事實上, 大多數時候,我是跟着吳師兄,來解leetcode的題的。總能隨着他的算法動畫,get到算法的解題意圖。 程序員
來自trekhlebes6
trekhleb的數據結構實現,很是nice, 強力推薦,我在刷leetcode 數據結構類題目時,使用trekhleb的代碼來實現github
結點代碼
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 查看鏈表等方法。
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 的方式和參考的開源項目,分享給你們,但願對你們有所幫助, 謝謝。 代碼