LeetCode 算法

来源:互联网 发布:seafile数据是否加密 编辑:程序博客网 时间:2024/06/07 18:42

本文参照 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;}