Algorithm
本周的算法题为 1. 两数之和 - 力扣(LeetCode)
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
ini
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
实现代码如下所示:
javascript
let nums = [2, 7, 11, 15], target = 9
var twoSum = function (nums, target) {
let output = []
nums.forEach((item, i) => {
nums.forEach((data, j) => {
if (i !== j) {
if (item + data === target) {
output.push(i)
output.push(j)
}
}
})
})
output = Array.from(new Set(output))
return output
};
twoSum(nums, target)
解题思路是,遍历两次 nums
数据,然后将 nums[i]
和 nums[j]
相加,如果其值等于 target
,则添加到 output
数组中,以示例1的数据举例,因为遍历两次,会出现 [0,1]
和 [1,0]
的情况,所以需要对数组去重,数组去重使用 Array.from(new Set(output))
实现。至此,是可以实现示例1的需求了,但是如果是示例2时,就会出问题。
ini
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
因为是遍历两次nums
数组的,当[0,0]
时,也是可以满足等于6的条件的,然后两个0就会被添加到output数组中,然后去重,就会有0,然后我们通过肉眼可知,正确结果是[1,2]的,为了解决这个漏洞就需要判断不要让同下标的数值进行相加,也就是if(i !== j)
。
这个代码实现思路其实很不满意,会有更优的实现方式,现在刚开始,首要目的是解得出来,后面总结再进一步学习和优化。
Review
The Reader in a Non-Bookish Community | by Mirra Esmael | Sep, 2023 | Medium
- 作者认为阅读和成为读者都是一种骄傲,它不是由你读过的书的数量来定义的,也不是因为阅读是大多数人觉得令人生畏的活动之一,而是作为一个读书意味着你的大脑已经探索了无数页的论点、概念、问题和表述。
- 在作者家乡,根据读者主要阅读材料,可以有三种类型读者:1、为了学习而读书;2、为了背诵《古兰经》;3、为了娱乐而读书,作者是第三种读者。
- 爱读书的人是积极地、有规律地或大部分时间都在读书的人。
- 虽然阅读对大多数人来说有积极的内涵和印象,但是没有实际行动来支持这一点。
- 不管读书带来的是好处还是坏处,作者一直认为它是一个积极的因素,它给作者带来了更多的机会。这就是为什么作者一直在向她的朋友和亲人宣传阅读。
Tip
yaml
node:internal/errors:477
ErrorCaptureStackTrace(err);
^
Error: Command failed with ENOENT: npm run clean
spawn npm run clean ENOENT
at Process.ChildProcess._handle.onexit (node:internal/child_process:283:19)
at onErrorNT (node:internal/child_process:478:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
errno: -2,
code: 'ENOENT',
syscall: 'spawn npm run clean',
path: 'npm run clean',
spawnargs: [],
originalMessage: 'spawn npm run clean ENOENT',
shortMessage: 'Command failed with ENOENT: npm run clean\nspawn npm run clean ENOENT',
command: 'npm run clean',
exitCode: undefined,
signal: undefined,
signalDescription: undefined,
stdout: '',
stderr: '',
failed: true,
timedOut: false,
isCanceled: false,
killed: false
}
从报错信息可知,代码在执行到npm run clean
命令时报错了,提示找不到这个命令,但是我复制命令在终端运行是成功的,在windows10系统是没问题的,但我在mac系统上运行就报错了,执行代码如下所示:
csharp
await execa('npm run clean')
初步猜测,可能execa用法在mac环境中不生效。将其注释,没有提示报错,所以,接着就要研究如何在mac环境中使用execa了。只需将
scss
execa('npm run clean')
改写为
php
execa('npm', ['run', 'clean'], { shell: true })
即可,这时,我们就会想知道这两种用法有什么区别呢?
execa
是一个用于执行shell
命令的Node.js
模块,它可以将命令作为参数传递给它,并返回一个Promise
,以便在命令执行完成之后处理。根据报错提示没有找到npm
命令,很有可能是execa模块无法正确识别到环境变量。
所以将npm run clean
拆分为npm
和run clean
两个参数,并将 shell 选项设置为true
,以便在子进程中运行命令的时候使用默认的shell
,这样可以正确找到npm
命令并且识别环境变量,找到npm
命令。
Share
- 使用
ChatGPT
有一段时间了, 发现用来工作和学习效率真是太高了,只要提问就能得到你想要的答案。我就一直在想,如果我一问就给出全部答案了,那我还写什么技术博文,直接复制粘贴就完成一篇技术博文了。但要真是这样,那可太没意思了,纯粹是搬运工,自己根本没掌握这些知识,有啥用?。ChatGPT
只是一个工具,工具没有好坏,要看使用工具的人。 - 一直觉得
技术+英语+法律
应该是一个比较有优势的程序员形态,技术就像Y轴,英语就像是X轴,法律是坐标轴外圆,这是你能拥有的安全的东西。技术让你站得更高,英语让你看得更远,法律是让你可以做对的事情。