本文参照 LeetCode题解 里面的例子都是用c/c++实现的,为了学习算法,将里面的实现方式改为JavaScript【如果有侵权请联系我】
数组类的算法
Remove Element
作为开胃菜,我当然选取了最容易的一道题目,在一个数组里面移除指定value,并且返回新的数组长度。这题唯一需要注意的地方在于in place,不能新建另一个数组。
方法很简单,使用两个游标i,j,遍历数组,如果碰到了value,使用j记录位置,同时递增i,直到下一个非value出现,将此时i对应的值复制到j的位置上,增加j,重复上述过程直到遍历结束。这时候j就是新的数组长度。
function removeEle (ary, ele) {
for(let i = 0; i < ary.length; i++) {
if(ary[i] === ele){
ary.splice(i, 1); // 注意数组删除后会有数组塌陷的问题
i--;
}
}
return ary;
}
Remove Duplicates from Sorted Array
这道题目与前一题Remove Element比较类似。但是在一个排序好的数组里面删除重复的元素。
/**
* 在一个排序好的数组里面删除重复的元素
* @param ary
*/
function filterAry(ary) {
const counter = {};
for (let i = 0; i < ary.length; i++) {
if (counter[ary[i]]) {
ary.splice(i, 1);
i--; // 注意数组塌陷;
} else {
counter[ary[i]] = true;
}
}
return ary;
}
Remove Duplicates from Sorted Array II
同样是移除重复的元素,但是可以允许最多两次重复元素存在
这里我们可以稍微把上面那个方法扩展下
/**
* 在一个排序好的数组里面删除重复的元素
* @param ary
* @param repeatCount
*/
function filterAry(ary, repeatCount) {
const counter = {};
for (let i = 0; i < ary.length; i++) {
if (counter[ary[i]]) {
counter[ary[i]] += 1;
if(counter[ary[i]] > repeatCount){
ary.splice(i, 1);
i--; // 注意数组塌陷;
}
} else {
counter[ary[i]] = 1;
}
}
return ary;
}
push One
将一个数字的每个位上的数字分别存到一个一维数组中,最高位在最开头,我们需要给这个数字加一,即在末尾数字加一,如果末尾数字是9,那么则会有进位问题,而如果前面位上的数字仍为9,则需要继续向前进位
function pushOne(ary) {
const aryLength = ary.length;
for (let i = aryLength - 1; i > -1; i--) {
if (ary[i] === 9) {
ary[i] = 0;
continue;
}
ary[i] += 1;
return ary;
}
ary.unshift(1);
return ary;
}
我们稍微在上一题的基础上扩展下,进位为指定的,比如 有一个数组
[1,2,3,4] 我们指定进位为2 然后第一项为最高位,
4 进1 变成 5 进位为2 5%2 = 2…1 那么4变成了1 向前进2
3 进 2 变成 5 同上 变为 1
…
处理完以后应该为 [1,1,0,1,1]
function pushOne(ary, carryFlag) {
const aryLength = ary.length;
let addCount = 1; // 初始为1
for (let i = aryLength - 1; i > -1; i--) {
const result = ary[i] + addCount;
if(result < carryFlag){
ary[i] = result;
return ary;
}
ary[i] = result % carryFlag;
addCount = Math.floor(result /carryFlag);
}
while (addCount){
ary.unshift(addCount % carryFlag);
addCount = Math.floor(addCount / carryFlag);
}
return ary;
}
Merge And Sort
/*
* Given two sorted integer arrays A and B, merge B into A as one sorted array.
Note: You may assume that A has enough space (size that is greater or equal to m + n) to hold additional elements from B. The number of elements initialized in A and B are m and n respectively.
给你两个整数数组, A, B 合并并排序
使用JS 的concat加sort 代码是最简洁的
* */
function mergeAndSort(aryA, aryB) {
let a = aryA.length;
let b = aryB.length;
const maxLength = a + b;
for (let i = maxLength - 1; i >= 0; i--) {
if (aryA[a - 1] < aryB[b - 1]) {
aryA[i] = aryB[b - 1];
b -= 1;
} else {
aryA[i] = aryA[a - 1];
a -= 1;
}
}
return aryA;
}