新年首刷
感想
说实话我看到这个题目的时候第一个想法就是用四数相加去解决,但是确实没有读题目的完全意思
用的方法是双指针法
假定有三个指针
我们希望找到所有不同的三元组 [nums[i], nums[j], nums[k]]
,使得 nums[i] + nums[j] + nums[k] == 0
。下面是这个函数如何处理这个数组的:
排序后的数组将是:
nums = [-4, -1, -1, 0, 1, 2]
排序是为了方便后续使用双指针技术,并且能更容易地跳过重复的元素。
外层循环从索引 i = 0
开始直到 nums.length - 2
(因为我们需要至少三个数来形成三元组)。
i = 0
(nums[i] = -4
)left = 1
,右指针 right = 5
(分别指向 -1
和 2
)。-4
。i = 1
(nums[i] = -1
)left = 2
,右指针 right = 5
(分别指向 -1
和 2
)。0
:-1 + (-1) + 2 = 0
。添加三元组 [-1, -1, 2]
到结果中。-1
。i
达到 nums.length - 2
。i = 2
时(第二个 -1
),由于它与前一个元素相同,会被跳过(避免重复的三元组)。最终结果将是所有找到的不重复的三元组,对于这个示例,结果是:
[[-1, -1, 2], [-1, 0, 1]]
这个结果表明在数组 [-4, -1, -1, 0, 1, 2]
中,这两个三元组的和为零,并且不包含重复的三元组。
三数之和和四数之和都是为了找不同索引且之和相同的数组
在 JavaScript 中,将字符串转换为数组的方法主要有以下几种:
使用 split
方法:
split
方法可以将字符串按照指定的分隔符拆分成数组。如果要将每个字符都分开成数组元素,可以使用空字符串作为分隔符。let arr = str.split('');
使用扩展运算符 ...
:
let arr = [...str];
使用 Array.from
方法:
Array.from
方法可以将两类对象转换为数组:类数组对象(拥有 length
属性和若干索引属性的任意对象)和可迭代对象(包括 ES6
新增的数据类型 Set
和 Map
)。let arr = Array.from(str);
使用 Object.assign
方法:
Object.assign
方法可以用来将字符串转换为数组,但这种方法相对不太直观。let arr = Object.assign([], str);
循环遍历字符串:
let arr = [];
for (let i = 0; i < str.length; i++) {
arr.push(str[i]);
}