判断一个链表是否有环

1,设置两个指针都指向头,一个每次走一步,一个每次走两步,当链表有环时,两个指针会相遇。

判断一个有环的链表,环长度

环长 = 每一次速度差 ✖️ 前进次数 = 前进次数

如果联表有环,求入环口

首先获取相遇点,p2从相遇点开始,p1从头指针开始,两个指针每次都走一步,此时的相遇点就是入环口

求栈的最小值,最大值,栈有pop,push,getMin,getMax方法

设置3个栈,一个基本栈存储内容、存储最大值栈、存储最小值栈,首先
第一个值入栈,假设是4,三个栈都存储此值
第二个值入栈,假设是3,3比4小,基本栈入栈,存储最小值栈入栈
第三个值入栈,假设是5,5比4大,基本栈入栈,存储最大值栈入栈
出栈5,最大值5与存储最大值栈,栈顶相等,基本栈出栈,存储最大值栈出栈

求最大公约数

辗转相除法

a/b的余数c,c与b求最大公约数,一直递归
缺点% 取模运算性能差

  1. function getGreatestCommonDivisor(a, b) {
  2. let max = a > b ? a : b;
  3. let min = a < b ? a : b;
  4. if (max % min === 0) {
  5. return min;
  6. }
  7. return getGreatestCommonDivisor(max % min, min);
  8. }
  9. getGreatestCommonDivisor(10, 25); // 5;

更相减损术

缺点,如果两个术相差较大,会减很多次。

  1. function getGreatestCommonDivisor(a, b) {
  2. if (a === b) {
  3. return a
  4. }
  5. let max = a > b ? a : b;
  6. let min = a < b ? a : b;
  7. return getGreatestCommonDivisor(max - min, min);
  8. }
  9. getGreatestCommonDivisor(10, 25); // 5;

位移加更相减损术

  1. function getGreatestCommonDivisor(a, b) {
  2. if (a === b) {
  3. return a
  4. }
  5. if (
  6. (a & 1) === 0 && (b & 1) === 0
  7. ) {
  8. return getGreatestCommonDivisor(a >> 1, b >> 1);
  9. } else if (
  10. (a & 1) === 0 && (b & 1) !== 0
  11. ) {
  12. return getGreatestCommonDivisor(a >> 1, b);
  13. } else if (
  14. (a & 1) !== 0 && (b & 1) === 0
  15. ) {
  16. return getGreatestCommonDivisor(a, b >> 1);
  17. } else {
  18. let max = a > b ? a : b;
  19. let min = a < b ? a : b;
  20. return getGreatestCommonDivisor(max - min, min);
  21. }
  22. }
  23. getGreatestCommonDivisor(10, 25); // 5;

求一个数是否是2的整数次幕

十进制,二进制,原始值-1,是否为2的整数次幕
8,1000B,111B,是
16,10000B,1111B,是
….

  1. function isPowerOf(a) {
  2. return a & a - 1 === 0;
  3. }

无序数组排序后求最大相临差

  1. function sort(arr) {
  2. let max = arr[0];
  3. let min = arr[0];
  4. for (let i = 0; i < arr.length; i++) {
  5. if (max < arr[i]) {
  6. max = arr[i];
  7. }
  8. if (min > arr[i]) {
  9. min = arr[i];
  10. }
  11. }
  12. const d = max - min;
  13. if (d === 0) {
  14. return 0;
  15. }
  16. const bucketNum = arr.length
  17. const bucketArr = [];
  18. for (let i = 0; i < bucketNum; i++)
  19. bucketArr.push({});
  20. for (let i = 0; i < arr.length; i++) {
  21. const index = parseInt((arr[i] - min) * (bucketNum - 1) / d);
  22. if (!bucketArr[index].min || bucketArr[index].min > arr[i]) {
  23. bucketArr[index].min = arr[i];
  24. }
  25. if (!bucketArr[index].max || bucketArr[index].max < arr[i]) {
  26. bucketArr[index].max = arr[i];
  27. }
  28. }
  29. const sortArr = [];
  30. let leftMax = bucketArr[0].max;
  31. let maxDistance = 0;
  32. for (let i = 1; i < bucketArr.length; i++) {
  33. if (!bucketArr[i].min) {
  34. continue;
  35. }
  36. if (bucketArr[i].min - leftMax > maxDistance) {
  37. maxDistance = bucketArr[i].min - leftMax;
  38. }
  39. leftMax = bucketArr[i].max;
  40. }
  41. console.log(maxDistance);
  42. return Number(maxDistance.toFixed(2));
  43. }
  44. var arr = [0.84, 4.5, 2.18, 0.5, 3.25]
  45. sort(arr);

栈实现队列

使用两个栈来实现,让入栈时,入栈到栈A中,当出栈时,检查栈B有没有内容,有的话直接出,没有的话,将栈A全部出栈到栈B中,在从栈B中出栈元素。

输入一个正整数,找出这个正整数所有数字全排列的下一个数。字典序算法解

例如 输入12345,则返回 12354
输入12354,则返回12435
输入12435,则返回 12453

  1. // 从后往前查逆序区域
  2. /*
  3. 求那个位置可以交互
  4. */
  5. function findTransferPoint(arr = []) {
  6. for (let i = arr.length - 1; i > 0; i--) {
  7. if (arr[i] > arr[i - 1]) {
  8. return i;
  9. }
  10. }
  11. return 0;
  12. }
  13. function findNearestNumber(arr = []) {
  14. const index = findTransferPoint(arr);
  15. if (index === 0) {
  16. return false;
  17. }
  18. var arrCopy = arr.map(item => item);
  19. // 逆序区域调整位置
  20. exchangeHead(index, arr);
  21. // 将交换位置后的,下标后面的按从小到大排序
  22. reverse(index, arr);
  23. return arr;
  24. }
  25. function reverse(index, arr) {
  26. var i = index;
  27. var j = arr.length - 1;
  28. while(i < j) {
  29. const temp = arr[i];
  30. arr[i] = arr[j];
  31. arr[j] = temp;
  32. i++;
  33. j--;
  34. }
  35. return arr;
  36. }
  37. function exchangeHead(index, arr) {
  38. const head = arr[index - 1];
  39. for (let i = arr.length - 1; i > 0; i--) {
  40. if (head < arr[i]) {
  41. arr[index - 1] = arr[i];
  42. arr[i] = head;
  43. break;
  44. }
  45. }
  46. return arr;
  47. }
  48. var a = [1,2,3,4,5]
  49. for (let i = 0 ; i < 10000; i++) {
  50. a = findNearestNumber(a);
  51. console.log(a);
  52. if (!a) {
  53. console.log(i + 1);
  54. break;
  55. }
  56. }