JS算法(二)

本文详细介绍了JavaScript实现的多种算法,包括爬楼梯、找数组中重复数字、字符串空格替换、链表反向输出、数组乘积计算、单词反转、重复字符统计、斐波那契数列、青蛙跳台阶、旋转数组找最小值等,涵盖数组、字符串、链表处理和递归等多种编程技巧。
摘要由CSDN通过智能技术生成

1.爬楼梯

爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢

1.思想

从第一阶开始假设:第0阶是零种,第一阶有一种,第二阶有两种
即: dp[0] = 0 dp[1] = 1 dp[2] = 2
那么有递推关系,到达第n阶楼梯有从n-1阶走一步和从第n-2阶走两步两种情况,一直往前推,可得递推式: dp[n] = dp[n-1] + dp[n-2]

2.JS代码

var climbStairs = function(n) {
    let dp = [];
    dp[0] = 0,dp[1] = 1,dp[2] = 2;
    for(let i = 3;i <= n;i++){
        dp[i] = dp[i-2] + dp[i-1];
    }
    return dp[n];
};

2.找出数组中任意一个重复的数字

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1
的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 1:

输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3

2.1 思想

用对象来存储某个数是否出现过,如果第一次出现就添加属性标识为true,否则就直接返回

2.2 JS代码

var findRepeatNumber = function(nums) {
  var flag={};
  for(var i=0;i<nums.length;i++){
      if(!flag[nums[i]])  flag[nums[i]]=true;
      else return nums[i];  
      //console.log(nums[i]);
      //console.log(flag[nums[i]]);
      //console.log(flag); //观察flag的变化
  }
};
s= [1,8,4,5,6,4,8,9,4]
console.log(findRepeatNumber(s))    //4

3.把字符串 s 中的每个空格替换成"%20"

示例 1: 输入:s = “We are happy.” 输出:“We%20are%20happy.”

3.1 思想

利用split()和join()

3.2 JS代码

var replaceSpace = function(s) {
    let arr=s.split(' ').join('%20')
    return arr
};

4.输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例 1:

输入:head = [1,3,2] 输出:[2,3,1]

4.1 思想

用unshift()的方法,将元素放入数组的最后一位,然后打印数组

4.2 JS代码

var reversePrint = function(head) {
  var arr = []
  while(head) {
      arr.unshift(head.val)
      head = head.next
  }
  return arr

5.使用 javascript 实现 productExceptSelf 方法

给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output,其中 output[i] 等于 nums 中除
nums[i] 之外其余各元素的乘积,参数为一个整数数组,返回一个数组。

5.1 思想

获得所有元素的乘积,再除nums[i]

5.2 JS代码


function productExceptSelf(nums) {
    var total = 1;
    //获得所有元素的乘积
    nums.forEach(value => {
        total *= value;
    });
    // map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
    // map() 方法按照原始数组元素顺序依次处理元素。
    //除以自身
    var newNums = nums.map(value => {
        return total / value;
    });
    return newNums;
}

var input = [1, 2, 3, 4];
console.log(productExceptSelf(input));   // [24, 12, 8, 6]
var input2 = [2, 3, 4, 5];
console.log(productExceptSelf(input2));  // [60, 40, 30, 24]

6.把句子按单词反转

反转后单词不能有多个空格。

6.1 思想

用正则表达式匹配空格返回的是数组,用reverse对数组反转,然后返回用空格拼接的字符串

6.2 JS代码


function reverseStr(str) {
    // \s 匹配空格
    var s = str.match(/[^\s]+/g)
    s = s.reverse();
    return s.join(' ');
}

str = 'Hello                world        !        ni     hao  ya';
console.log(reverseStr(str));   
// ya hao ni ! world Hello

//match() 方法将检索字符串 String Object,以找到一个或多个与 regexp 匹配的文本。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。如果 regexp 没有标志 g,那么 match() 方法就只能在 string Object 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。



7.使用 javascript 实现 dupicatedWord() 方法

统计数组中字符出现的频次,返回一个 Object<String, Boolean> 对象,字符为 key,当出现两次以上将 value 置为 true,否则为 false。

7.1 思想

使用对象方法,遍历数组中的值,在三目运算中进行判断。先判断obj[value]是否存在,不存在就false,存在就true,再把值赋回obj[value]。
(运算优先级:=== 大于 ? 大于 =)

7.2 JS代码

function dupicatedWord(arr) {
    let obj = {};
    arr.forEach((value) => {
        obj[value] = typeof obj[value] === 'undefined' ? false : true;
    });

    return obj;
}

let arr = ['a', 'a', 'b', 'b', 'c'];
console.log(dupicatedWord(arr));  // {a: true, b: true, c: false}

8.写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。

斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N >

  1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

8.1 思想

dp[i]含义:斐波那契数列的第i个数为dp[i]
递推公式:根据定义易得:dp[i] = (dp[i - 1] + dp[i - 2])
遍历顺序:根据定义,当前数依赖于前两个数,所以从前向后遍历

8.2 JS代码



    const fib = n => {
    const dp = [0, 1];
    for (let i = 2; i <= n; i++) {
        dp[i] = (dp[i - 1] + dp[i - 2]) % 1000000007;
    }
    return dp[n];
};

9.一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

9.1 思想

初始的式子为:dp = [1, 1]
有递推关系,到达第n阶楼梯有从n-1阶走一步和从第n-2阶走两步两种情况,一直往前推,可得递推式: dp[n] = dp[n-1] + dp[n-2] .

9.2 JS代码

var numWays = function(n) {
      
    let dp = [1, 1]
    for(let i = 2; i <= n; i++) {
        dp[i] = (dp[i-1] + dp[i-2]) % 1000000007
    }
    return dp[n]


};

10.旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 给你一个可能存在 重复 元素值的数组 numbers
,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为
[1,2,3,4,5] 的一次旋转,该数组的最小值为 1。 注意,数组 [a[0], a[1], a[2], …, a[n-1]]
旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。

示例 1: 输入:numbers = [3,4,5,1,2] 输出:1

示例 2: 输入:numbers = [2,2,2,0,1] 输出:0 提示: n == numbers.length 1 <= n
<= 5000
-5000 <= numbers[i] <= 5000 numbers 原来是一个升序排序的数组,并进行了 1 至 n 次旋转

10.1 思想

用展开运算符将数组展开,利用JS中的min()函数判断后返回。

10.2 JS代码

var minArray = function(numbers) {
  return Math.min(...numbers)
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值