Skip to content

Commit e19c670

Browse files
committed
feat: 增加一些Js解法
1 parent fb72abf commit e19c670

10 files changed

+737
-182
lines changed

Array/KthLargestElementInAnArray.js

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/**
2+
* @param {number[]} nums
3+
* @param {number} k
4+
* @return {number}
5+
*/
6+
7+
// 写了个快排和归并。
8+
function sort(arr) {
9+
// 快排
10+
if (arr.length === 0) {
11+
return arr
12+
}
13+
14+
// 选种
15+
let bean = Math.floor((arr.length-1) / 2)
16+
let base = arr[bean]
17+
let bigger = []
18+
let smaller = []
19+
20+
for (let [index, item] of arr.entries()) {
21+
if (index === bean) {
22+
continue
23+
}
24+
25+
if (item >= base) {
26+
bigger.push(item)
27+
} else {
28+
smaller.push(item)
29+
}
30+
}
31+
32+
return [...sort(smaller), base, ...sort(bigger)]
33+
34+
}
35+
36+
// 归并
37+
function split(arr) {
38+
let bean = Math.floor((arr.length-1) / 2)
39+
let left = arr.slice(0, bean)
40+
let right = arr.slice(bean)
41+
42+
return [left, right]
43+
}
44+
45+
function merge(arr, arr2) {
46+
let result = []
47+
48+
let index1 = 0
49+
let index2 = 0
50+
51+
while (index1 <= arr.length - 1 && index2 <= arr2.length - 1) {
52+
if (arr[index1] < arr2[index2]) {
53+
result.push(arr[index1])
54+
index1 += 1
55+
} else if (arr[index1] > arr2[index2]) {
56+
result.push(arr2[index2])
57+
index2 += 1
58+
} else {
59+
result.push(arr[index1], arr2[index2])
60+
index1 += 1
61+
index2 += 1
62+
}
63+
}
64+
// 如果第一个arr
65+
if (index1 <= arr.length - 1) {
66+
result.push(...arr.slice(index1))
67+
}
68+
69+
if (index2 <= arr2.length - 1) {
70+
result.push(...arr2.slice(index2))
71+
}
72+
73+
return result
74+
}
75+
76+
function sort2(arr) {
77+
if (arr.length <= 8) {
78+
return sort(arr)
79+
}
80+
let sp = split(arr)
81+
// return sp.reduce((a,b) => merge(a,b))
82+
return merge(sort2(sp[0]), sort2(sp[1]))
83+
}
84+
85+
86+
87+
var findKthLargest = function(nums, k) {
88+
// nums = nums.sort((a,b) => b-a)
89+
// nums = sort(nums)
90+
// nums = split(nums)
91+
// nums = merge(nums[0], nums[1])
92+
nums = sort2(nums)
93+
// console.log(nums)
94+
return nums[nums.length-k]
95+
};

Array/LinkedListCycle.js

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* function ListNode(val) {
4+
* this.val = val;
5+
* this.next = null;
6+
* }
7+
*/
8+
9+
/**
10+
* @param {ListNode} head
11+
* @return {boolean}
12+
*/
13+
14+
// 两个指针,一个一次走一步,一个一次走两步,如果有环会在某处相遇。
15+
var hasCycle = function(head) {
16+
if (!head) {
17+
return false
18+
}
19+
let oneIndex = head
20+
let twoIndex = head.next
21+
22+
if (!twoIndex) {
23+
return false
24+
}
25+
26+
while (oneIndex && twoIndex) {
27+
if (oneIndex === twoIndex) {
28+
return true
29+
}
30+
31+
oneIndex = oneIndex.next
32+
twoIndex = twoIndex.next
33+
34+
if (!twoIndex || !twoIndex.next) {
35+
return false
36+
}
37+
38+
twoIndex = twoIndex.next
39+
}
40+
41+
return false
42+
};

Array/ReverseLinkedList.js

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* function ListNode(val, next) {
4+
* this.val = (val===undefined ? 0 : val)
5+
* this.next = (next===undefined ? null : next)
6+
* }
7+
*/
8+
/**
9+
* @param {ListNode} head
10+
* @return {ListNode}
11+
*/
12+
13+
// 翻转链表的思路
14+
// 把head取出来,把head.next取出来,head.next.next也取出来。
15+
// head.next = head
16+
// 新的(head.next和head)与head.next.next进行新一轮交换。
17+
// 直至空。
18+
// PS,链表操作好麻烦。
19+
var reverseList = function(head) {
20+
21+
let newHead = null
22+
23+
// 先不判断进行一次交换
24+
let nHead = head
25+
if (!nHead) {
26+
return null
27+
}
28+
let next = nHead.next
29+
if (!next) {
30+
return nHead
31+
}
32+
let lNext = next.next
33+
34+
next.next = nHead
35+
nHead.next = null
36+
37+
newHead = next
38+
39+
while (nHead && next && next.next) {
40+
nHead = lNext
41+
if (!nHead) {
42+
return newHead
43+
}
44+
45+
next = nHead.next
46+
47+
if (!next) {
48+
nHead.next = newHead
49+
return nHead
50+
}
51+
lNext = next.next
52+
53+
next.next = nHead
54+
nHead.next = newHead
55+
56+
newHead = next
57+
58+
}
59+
};

Array/ReverseNodesInk-Group.js

+99
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// 这个有图,直接看链接吧。
2+
// https://leetcode-cn.com/problems/reverse-nodes-in-k-group/
3+
// hard
4+
5+
/**
6+
* Definition for singly-linked list.
7+
* function ListNode(val, next) {
8+
* this.val = (val===undefined ? 0 : val)
9+
* this.next = (next===undefined ? null : next)
10+
* }
11+
*/
12+
/**
13+
* @param {ListNode} head
14+
* @param {number} k
15+
* @return {ListNode}
16+
*/
17+
18+
// 思路就是获取k个节点,然后翻转。
19+
// 循环这个操作。
20+
// 思路不难,个人感觉难点在于ListNode是在不好操作。
21+
var reverseKGroup = function(head, k) {
22+
function getKNodes(head) {
23+
let nodes = []
24+
let newHead = head
25+
26+
//
27+
while (nodes.length < k && newHead) {
28+
nodes.push(newHead)
29+
newHead = newHead.next
30+
}
31+
32+
return nodes
33+
}
34+
35+
function reverse(nodes) {
36+
// 将nodes里的ListNode关系翻转
37+
if (!nodes.length) {
38+
return null
39+
}
40+
41+
if (nodes.length === 1) {
42+
return [nodes[0],null,null]
43+
}
44+
45+
// 新开始的节点应为最后一个节点的下一个
46+
let newStartNode = nodes[nodes.length - 1].next
47+
// 最后一个节点是翻转前的第一个节点
48+
let lastNode = nodes[0]
49+
50+
let rNodes = nodes.reverse()
51+
// 翻转后的头节点是翻转后的最后一个节点。
52+
let first = rNodes[0]
53+
let indexF = first
54+
for (let i of rNodes.slice(1)) {
55+
i.next = null
56+
indexF.next = i
57+
indexF = i
58+
}
59+
// 返回新的头
60+
// 和下次迭代应该开始新头,为原nodes[-1]的next
61+
return [first, newStartNode, lastNode]
62+
63+
}
64+
65+
let first = getKNodes(head)
66+
67+
if (!first.length) {
68+
return null
69+
}
70+
71+
if (first.length < k) {
72+
return head
73+
}
74+
75+
let [newHead, newStartNode, lastNode] = reverse(first)
76+
let indexNewHead = lastNode
77+
78+
// 循环翻转
79+
// newHead为新的head,返回用,newStartNode是下一次取K个node开始的节点。
80+
// lastNode为当前节点的最后一个节点,用来将新的节点的head接到最后一个节点上。
81+
while (1) {
82+
if (!newStartNode) {
83+
return newHead
84+
}
85+
let kNodes = getKNodes(newStartNode)
86+
if (kNodes.length < k) {
87+
if (indexNewHead) {
88+
indexNewHead.next = kNodes[0]
89+
}
90+
return newHead
91+
}
92+
93+
let [n, ns, l] = reverse(kNodes)
94+
indexNewHead.next = n
95+
newStartNode = ns
96+
lastNode = l
97+
indexNewHead = l
98+
}
99+
};

Array/twoSum.js

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* @param {number[]} nums
3+
* @param {number} target
4+
* @return {number[]}
5+
*/
6+
// 简单的O(1)查找。
7+
var twoSum = function(nums, target) {
8+
let dicts = {}
9+
10+
for (let [index, data] of nums.entries()) {
11+
dicts[data] ? dicts[data].push(index) : (dicts[data] = [index])
12+
}
13+
14+
15+
for (let i of nums) {
16+
if (dicts[target - i]) {
17+
if (target-i === i) {
18+
if (dicts[i].length === 2) {
19+
return [dicts[i][0], dicts[i][1]]
20+
} else {
21+
continue
22+
}
23+
24+
}
25+
26+
return [dicts[i][0], dicts[target-i][0]]
27+
}
28+
}
29+
};

DP/ClimbingStairs.js

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/**
2+
* @param {number} n
3+
* @return {number}
4+
*/
5+
var climbStairs = function(n) {
6+
let dp = [
7+
1,
8+
2
9+
]
10+
11+
if (n <= 2) {
12+
return dp[n-1]
13+
}
14+
15+
for (let i=2;i<n;i++) {
16+
dp.push(dp[i-2]+dp[i-1])
17+
}
18+
return dp[n-1]
19+
};

0 commit comments

Comments
 (0)