力扣刷题日记01

力扣刷题日记01

24.3.26

今天记录一下使用力扣刷题的一些笔记。(事实上很早就在刷了…虽然用的不是力扣,但是今天突然发现原来我是要用JS刷题了hhhh,之前一直用C++写题来着……)

坚持记录一下刷题的情况和涉及的知识点。

1. 两数之和 · 哈希表

题目目标:返回给定数组中满足相加等于 Target 的两元素下标。

本题在涉及“考虑重复元素”和“不考虑重复元素”时可以有两种不同的解法(虽然原理都差不多hhhh)

(1)解法一:新建立一个数组 preNum[] 存放遍历过的元素值和坐标,遍历数组,在遍历每一个元素时求出对应的 (target - nums[i] )值,如果发现preNum[]中有对应值,则返回;若没有,则把自己存入preNum,继续遍历。

(2)解法二:和上一过程基本相同,不过使用Map存放遍历过的元素值和坐标,遇到重复元素也可以解决。

关于Map

map() 是一个数组方法,用于创建一个新数组,其元素是原始数组中每个元素调用提供的函数后的返回值。

基本用法

const array = [1, 2, 3, 4, 5];
const newArray1 = array.map((element) => {
  return element * 2;
});
console.log(newArray); // 输出: [2, 4, 6, 8, 10]

在这个例子中,map() 方法会遍历 array 数组中的每个元素,并将每个元素乘以2,然后将结果存储在 newArray 中。

参数

map() 方法接受一个函数作为参数,这个函数将在数组中的每个元素上调用,并且会接收三个参数:

  1. element(必需):当前正在处理的元素。
  2. index(可选):当前正在处理的元素的索引。
  3. array(可选):调用 map() 方法的数组。

使用箭头函数

通常,我们使用箭头函数来简化代码:

const newArray = array.map(element => element * 2);

注意事项

  • map() 方法不会修改原始数组,而是返回一个新数组。
  • 如果原始数组中存在空元素或被删除的元素,它们在返回的新数组中仍然存在,但是调用映射函数时将被跳过。
  • map() 方法创建一个新的数组,因此它对于不可变数据和函数式编程非常有用。

2. 字母异位词分组 · 哈希表 + 质数

题目目标:找出给定字符串数组中组成字母相同的字符串元素并输出

(1)解法一:用质数的方法做,将不同的字母对应为不同质数,化为唯一乘积即可(但是记得复习一下如何快速找到26个素数)。

素数筛
function sieveOfEratosthenes(n) {
    // 创建一个布尔数组,用于记录每个数字是否为素数,默认都为素数
    const isPrime = new Array(n + 1).fill(true);
    // 0 和 1 不是素数,将它们标记为 false
    isPrime[0] = false;
    isPrime[1] = false;
    // 开始筛选
    for (let i = 2; i <= Math.sqrt(n); i++) {
        // 如果当前数字为素数
        if (isPrime[i]) {
            // 将当前数字的倍数标记为非素数
            for (let j = i * i; j <= n; j += i) {
                isPrime[j] = false;
            }
        }
    }
    // 收集所有素数
    const primes = [];
    for (let i = 2; i <= n; i++) {
        if (isPrime[i]) {
            primes.push(i);
        }
    }
    return primes;
}
// 示例:找出 100 以内的所有素数
const primes = sieveOfEratosthenes(100);
console.log(primes); // 输出素数数组

(2)解法二:将字符串元素遍历的同时对每个字符串元素进行处理:分隔为单个字符、排序、重新组合,比较后输出。

关于Sort()

sort() 用于对数组的元素进行排序。默认情况下,sort() 方法将数组元素转换为字符串,并按照 Unicode 顺序进行排序。但是,它可以接受一个比较函数作为参数,以便进行自定义排序。

基本用法

const array = [3, 1, 2];
array.sort();
console.log(array); // 输出: [1, 2, 3]

自定义排序

如果要对非字符串数组进行排序,或者要进行自定义排序,可以将一个比较函数作为参数传递给 sort() 方法。

const array = [10, 5, 20, 2];
array.sort((a, b) => a - b);
console.log(array); // 输出: [2, 5, 10, 20]

负数升序,正数降序。

注意事项

  • sort() 方法会修改原始数组,并且默认按照 Unicode 顺序进行排序。如果需要保留原始数组,可以先复制一份再进行排序。
  • 当比较的元素是字符串时,sort() 方法会按照字符串的 Unicode 顺序进行排序,这可能不是你想要的结果。所以在排序字符串时,你可能需要使用自定义的比较函数来进行排序。
  • 如果数组包含 undefinednull 元素,它们会被排在数组的开头。

3.最长连续序列 · 哈希 + 并查集

题目目标:找出给定数组中数字连续的最长序列

(1)解法一:哈希表,将数组中每个元素映射的值设为该元素数值相邻两元素向左和向右最长序列之和再加一,取最大值为结果。

(2)解法二:并查集,猜猜我为什么没写?因为昨天学烦了直接干别的去了……(无语(ˉ▽ˉ;)…)

24.3.27

早上好米娜桑,今天真的很困……

写了三道题,都是用双指针就可以解决的,懒得记了,没新意。

24.3.29

Set

在JavaScript中,Set是一种数据结构,用于存储唯一值,即集合中的每个元素必须是唯一的。Set是ES6中新增的数据结构,它提供了一种有效地存储和检索数据的方式。

创建 Set

你可以通过以下方式创建一个Set:

const mySet = new Set();

添加元素

你可以使用 add() 方法向Set中添加元素:

mySet.add(1);
mySet.add(2);
mySet.add(3);

删除元素

你可以使用 delete() 方法从Set中删除元素:

mySet.delete(2);

检查元素是否存在

你可以使用 has() 方法检查Set中是否存在某个元素:

console.log(mySet.has(1)); // 输出: true
console.log(mySet.has(2)); // 输出: false

获取 Set 的大小

你可以使用 size 属性获取Set中的元素数量:

console.log(mySet.size); // 输出: 2

迭代 Set

Set是可迭代的,你可以使用 forEach() 方法或 for...of 循环来遍历Set中的元素:

mySet.forEach((value) => {
  console.log(value);
});

for (const item of mySet) {
  console.log(item);
}

从数组创建 Set

你可以通过传递一个数组给Set的构造函数来创建一个包含数组中所有唯一元素的Set:

const myArray = [1, 2, 3, 1, 2];
const mySet = new Set(myArray);
console.log(mySet); // 输出: Set { 1, 2, 3 }

使用 Set 去除数组中的重复元素

由于Set只能存储唯一值,你可以很容易地使用Set来去除数组中的重复元素:

const myArray = [1, 2, 3, 1, 2];
const uniqueArray = [...new Set(myArray)];
console.log(uniqueArray); // 输出: [1, 2, 3]

今天写了两道滑动窗口的题,都没有很难。

24.4.1

愚人节快乐!

今天写了三道字串题。之后可能进度不会仔细更,重点还是看刷题时学到的知识点笔记。

24.4.3

昨天放假了一天……咳咳咳,只写了一道题。

image-20240403115959974

总结:写题的时候能有一些思路,但是在用代码实现的时候还是会发现有问题,(比如说JS语法不熟练,思路不清晰,考虑情况没考虑完整等)
① 前面几道中等题,189最简单,直接用新数组替换就好了;56也还好,需要排序后判断更新一下边界最后放入答案;238忘记了,回去看了一下题目,需要预存一下左右两边数的乘积然后相加
②两道困难题,缺失整数比较好理解,接雨水用了动态规划,对着题解代码画了图才明白。
③ 最后一个矩阵题很简单,后面写烦了,没有认真写。
④ 感觉自己写题还是不太能完全直接看题出思路和代码,有点依赖题解。可能二刷会好一点?

好的,关于力扣刷题C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,包含了许多常用的容器和算法。在力扣刷题中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷题中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷题中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷题中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣刷题中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣刷题中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣刷题中,使用 string 可以方便地处理字符串相关的问题。 9. 注意边界条件:在力扣刷题中,边界条件往往是解决问题的关键。需要仔细分析题目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷题中,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值