Shell中exec、source和shell script的区别

exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息。
bash shell的命令分为两类:外部命令和内部命令。外部命令是通过系统调用或独立的程序实现的,如sed、awk等等。内部命令是由特殊的文件格式(.def)所实现,如cd、history、exec等等。

在说明exe和source的区别之前,先说明一下fork的概念。

fork是linux的系统调用,用来创建子进程(child process)。子进程是父进程(parent process)的一个副本,从父进程那里获得一定的资源分配以及继承父进程的环境。子进程与父进程唯一不同的地方在于pid(process id)。

环境变量(传给子进程的变量,遗传性是本地变量和环境变量的根本区别)只能单向从父进程传给子进程。不管子进程的环境变量如何变化,都不会影响父进程的环境变量。

shell script:

有两种方法执行shell scripts,一种是新产生一个shell,然后执行相应的shell scripts;一种是在当前shell下执行,不再启用其他shell。
新产生一个shell然后再执行scripts的方法是在scripts文件开头加入以下语句
#!/bin/sh
一般的script文件(.sh)即是这种用法。这种方法先启用新的sub-shell(新的子进程),然后在其下执行命令。
另外一种方法就是上面说过的source命令,不再产生新的shell,而在当前shell下执行一切命令。

source:

source命令即点(.)命令。
在bash下输入man source,找到source命令解释处,可以看到解释”Read and execute commands from filename in the current shell environment and …”。从中可以知道,source命令是在当前进程中执行参数文件中的各个命令,而不是另起子进程(或sub-shell)。

exec:

在bash下输入man exec,找到exec命令解释处,可以看到有”No new process is created.”这样的解释,这就是说exec命令不产生新的子进程。那么exec与source的区别是什么呢?
exec命令在执行时会把当前的shell process关闭,然后换到后面的命令继续执行。

三大操作系统比较,为什么开发要用Linux系统?

交流学习java大数据加QQ群460570824.

windows, macOS,linux是当今主流三大操作系统,普通用户一般是选择windows或macOS, linux主要是占据服务器领域市场。这三个操作系统给人的感觉是:windows经济适用,档次较低; macOS高端大气上档次; Linux是*客专用,一个黑乎乎的窗口,各种花花绿绿的指令在闪烁,对着键盘噼里啪啦一通乱敲,就能窃取各种机密…

普通用户对于操作系统的选择很简单,经济实用选windows,钱多讲究格调选macOS, 毕竟普通用户切换操作系统的成本并不大。而程序员就不一样了,换一个操作系统,就意味着所有开发环境都要一并更换。而且在程序员群体中,操作系统有以下的鄙视链:macOS–>linux–>windows。

其实操作系统的比较并不是简单粗暴的单一维度比较,用windows并不意味着low,用linux也不等同于你就是一个*客。关键在于你是如何使用。就好比编程语言的选择,php是*招人黑的语言(没有之一), 但黑php的人中有不少人写的代码同样不堪入目。

不过作为一个程序员,你很有必要学会linux,如果你的程序*终是跑在线上的Linux服务器上,那么你就更应该从现在开始投入linux的怀抱中,早日从windows脱坑。至于macOS,在命令行上与linux*大部分相同,都是类unix的操作系统。简单地说,macOS是一个比windows界面更加美观,同时又兼备linux强大命令行的操作系统. 要说macOS的缺点,那就是贵…

windows与linux的根本区别:自由
%title插图%num

windows与linux的设计理念有根本性的区别:

windows:用户不知道自己想要什么,也不明白自己在做什么,更不打算为自己的行为负责。

因此windows将所有操作都隐藏起来,只给用户提供封装好的功能,用户只能在操作系统限制的范围内操作,如果是普通用户,会觉得很windows很舒服,因为不需要思考。只需要按照指示去操作。但对于开发人员而言,这种设计理念是无法接受的,一旦要做出一些超越封装好的功能之外的事情,就会出现各种难以意料的情况,而且很多情况下,这些问题是无解的。或者只能用*其蹩脚扭曲的方式去勉强处理,然后瑟瑟发抖地期待着程序能正常运行。因为一旦程序崩溃,你也会为之崩溃。在windows下作开发,那种体验就好比在陪伴一个任性的女朋友,虽然长得清秀靓丽,但喜怒无常,她开心时,彼此相安无事,她不开心时,就直接哭闹,你问她:怎么了?她也不说原因,只是一直哭。你只能试着用各种方式去哄她开心,即使这次能哄好她,并不意味着下次同样的方法能奏效。这样的相处方式,很累。不是她不好,而是彼此不适合。即使终日相伴,却依然对其一无所知。

linux:用户知道自己想要什么,也明白自己在做什么,并且会为自己的行为负责。

linux将所有操作权都交给了用户,她相信用户是理性的聪明的,忠实地执行用户的指令,向用户暴露所有的细节。用户在拥有自主权的同时也拥有了破坏力,因此普通用户根本无法驾驭,可能一个指令就把操作系统弄崩溃了。对于开发者而言,linux的开放与自由给了我们无限的可能性,我们能看到程序是如何运行的,运行报错也会有友好的提示。根据报错指引往往能将问题解决。与之相处,好比与一个成熟的女性相处,历经风雨,已经不再关注浮夸的外表,而是关注内在的涵养。刚接触时,可能会觉得她高冷,慢慢地,会发现她很善解人意,心情不好时她会跟你说是什么原因造成的,彼此商量如何解决这个问题,而不是无来由地崩溃。与之相处,会感到很舒服,彼此坦诚,无需套路,你在想什么,我都知道。我在念什么,你也明白。

因此,我选择linux的原因在于自由、舒服,简言之:爽!

至于win10自带的WSL(linux子系统), 说起来都是泪,几个月前,我兴冲冲地折腾,以为windows可以完美地支持linux,结果,连个nginx都跑不起来,去wsl的github源码查看issue,才知道这就是wsl的一个bug!此外,还有其他各种坑,这感觉就像:分手后的任性前女友画风突变:善解人意,人情练达。你欣喜万分地准备复合,她马上又原形毕露。咱能不能多些真诚,少些套路…

迅哥说过:生命是以时间为单位的,浪费别人的时间等于谋财害命,浪费自己的时间等于慢性自杀。对于程序员而言,开发环境远离windows,就是珍惜生命的表现(开发windows程序的除外)

选择哪个发行版的linux

redhat,suse, Debian等各个发行版的linux都有各自的忠实拥护者,无法判断这些发行版孰优孰劣,毕竟“存在即合理”。我从实用的角度来看,选择的是redhat(红帽)系列的centos。

因为线上的服务器大多数是ceotos,我们的程序*终是在线上运行的,如果能将本地环境配置得跟线上一致,就可以减少很多莫名其妙的环境问题。而且熟悉使用centos,基础的运维能力也都掌握了

至于版本选择,肯定是要选择*新的centos7, centos7与centos6存在很多差异,性能有很大的提升

如何学linux

工作中,看到不少工作好几年的程序员,在操作linux时特别生疏,只会*基本的几个命令:cdls mkdir 等。vim编辑器的操作更是让人看了很着急,被誉为编辑器之神的vim在他们手中,完全没有半点灵气,感觉就像是编辑器之屎。

之所以会出现这种现象,很大原因在于他们的学习方式错了,不少人都知道linux很重要,不掌握linux,基本上就只能停留在*基本的增删改查功能上。他们学linux的方式可能是看书,也可能是看视频,甚至有些还会去背命令,但由于他们的操作环境是windows,linux的应用场景很少。根本没办法将所学的知识运用,更加感受不到linux的魅力。

学linux*好地方式,就是直接去用!直接将自己的开发环境都改成linux,一开始很蹩脚,很不适应,这很正常。如果你一直感到很舒服,只能说明你一直没有进步。想想我们学了那么多年英语,*大多数人还是无法掌握英语,看到英语文档就直接自动屏蔽。其原因都是:一直在学,但从来没在用。只学而不用,没有半点用。

 

原来 Linux 内核贡献第二是这么来的

原来 Linux 内核贡献第二是这么来的
27 labulaka521 · labulaka521 · 4 小时 38 分钟前 · 9803 次点击
%title插图%num

Linux 内核 贡献 原来139 条回复 • 2021-06-21 16:46:18 +08:00
1 2
2
❮ ❯
ohwind 101
ohwind 1 小时 47 分钟前 ❤️ 2
@Iserlohn44 这贴下面的不都在讨论这个事?贡献无用代码增加工作量不能嘲讽两句吗?我觉得这种不道德的行为应该被谴责。
Samuelcc 102
Samuelcc 1 小时 46 分钟前 via Android ❤️ 1
@hwdef 你一直让我回答你的问题,我如实回答,没有任何说我“高大上”的意思。是的,大部分开发者没有给 linux 这样的核心项目提交过代码,你就咬定这一点就可以随便喷人了是吗?
另外我发 issue 是有具体的解决方案的,不是只提出问题让开发者去解决。另外这也是开源社区的一部分,我也没有看到哪个大型项目维护者辱骂提出 issue 的人,称他们恶心。你又是在那个位置和立场在这里怒骂呢?
另外我一直觉得你阅读是不是有障碍,邮件中并不是说这类 pr 是违反规则的,而是说华为这种大型公司不应该一直以提大量这种没有技术含量的 pr 来刷 kpi 。你好像一直没理解,令人遗憾。
wuqingdzx 103
wuqingdzx 1 小时 43 分钟前 ❤️ 1
有一说一. 这人及类似行为确实问题很大, 可耻.

但我觉得吧, 上升到公司层面的话, 在注水比例不明确之前, 不至于这么高潮吧?
washbrain 104
washbrain 1 小时 43 分钟前
看了下知乎,有一种可能是华为内部在做代码质量优化,作者可能是修改了公司内部的 linux 版本然后同步到上游?当然提交的方式不太正确
感觉还是有受公司政策影响的
Iserlohn44 105
Iserlohn44 1 小时 40 分钟前
@ohwind 你是不是理解不了什么叫「就事论事」?还有你仿佛只会二分的逻辑,实在让人无语。
ladypxy 106
ladypxy 1 小时 38 分钟前
有一说一,这种明显就是刷 KPI 的。
像我在某血汗工厂,公司会看你写了多少 CR 。然后大家就就故意一个 CR 修复一个 typo…虽然明明是一个 CR 搞定的事
hwdef 107
hwdef 1 小时 34 分钟前
@Samuelcc

我觉得你先开喷的,你觉得我先开喷的,

我们对于“喷”的定义不同,没必要讨论了。
atwoodSoInterest 108
atwoodSoInterest 1 小时 31 分钟前
子贡赎牛,老典故了。利益不是罪恶,合理利用利益来导向世界才是正解。

其实题上这种拍桌而起的都是内心干净的人,但是这种干净却又和世界无序脏乱冲突,变成了清厉。
我能理解这种人,因为我也深陷其中,至今仍在挣扎。
但是为社会为国为世界,不是他们这种偏执的人能胜任的,需要更有容量更有眼界的人。
ohwind 109
ohwind 1 小时 28 分钟前 ❤️ 8
@Iserlohn44
>就事论事,读音是 jiù shì lùn shì,汉语成语,依据事情本身的情况来作评论或判断。现又指仅从事物的表面现象孤立、静止、片面地议
以及究竟是谁只会二分?
一,华为是否做了这件事?做了。
二,这种行为是道德的吗?不道德。
三,针对这种行为可以谴责嘲讽吗?不道德的行为我认为嘲讽几句无关紧要。
请问是谁没有就事论事?
yukiww233 110
yukiww233 1 小时 27 分钟前
之前的 commit 还挺正常的啊…
2021 之后就几乎全是 fix error return code, Remove redundant, fix spelling 和 reformat , 分布还很均匀, 是 kpi 要求没跑了

shuAS 111
shuAS 1 小时 21 分钟前 ❤️ 1
刚一打开帖子看评论,我还以为进到品葱了呢?
idealhs 112
idealhs 1 小时 20 分钟前
@atwoodSoInterest 赎人受牛。
你想表达的是,华为的 KPI 导向有问题是吗。
lakehylia 113
lakehylia 1 小时 19 分钟前
想起了新的 HR 以代码量来评价工作量,于是就有了各种斗法
GalaDOS 114
GalaDOS 1 小时 14 分钟前
already broken reputation 很刺眼呀
Iserlohn44 115
Iserlohn44 1 小时 12 分钟前
@ohwind 原来在你看来无意义的嘲讽,而不是针对事情本身发出有建设性的评论也是就事论事。那确实不用聊了。
其次,你居然真能问出「究竟是谁只会二分」?不会看看自己的发言 – 「只许夸了是吧」?
nicevar 116
nicevar 1 小时 10 分钟前 ❤️ 4
总有些人逮住华为一丁点东西就能嘲讽整个华为甚至上升到民族和国家,脑袋被驴踢过一样,这个地方很多人黑华为已经没有下限了。
phh 117
phh 1 小时 4 分钟前 ❤️ 24
说黑华为没有下限的,那是因为你们吹华为没有底线让人家反感了,遭到反噬了,什么东西都要吹嘘上升到民族高度,先有华为后有天的话都敢说。
ohwind 118
ohwind 1 小时 1 分钟前
@Iserlohn44 对这件事建设性的评论就是这种行为十分无耻以及十分可恶,不然要怎么评论?说他干的好?讨论它的合理性?
对基本是非没有自己的判断,见不得别人对自己维护的产品的批评,这和娱乐圈玩的那一套有何区别?
或者你认为把别人的批评说成“高潮了”是富有建设性的?
dustinth 119
dustinth 57 分钟前
比较好奇这个帖子里面有没有华为的. 哈哈.
做错事就认, 没有做错事, 没有刷 KPI, 理直气壮的就怼回去好了.
turi 120
turi 56 分钟前
提到华为,一帮人就想到国家。

厉害了
sunocean 121
sunocean 55 分钟前 ❤️ 10
@nicevar 华为跟国家和民族有什么关系?你这帖子是想表达什么呢?一个公司做错事了,大众批评他就叫黑吗?一般认为,有事实有依据的事儿叫批评指正,无端臆造才叫黑。你无端把一个没有道德底线的公司和一个国家和民族捆绑在一起,我们有理由怀疑你脑袋被驴踢了,在黑这个国家,黑这个民族。
baiyi 122
baiyi 55 分钟前
华为用这种方式刷成贡献第二也是真的丢人,这样刷 KPI,公司有问题,人也有问题
ohwind 123
ohwind 54 分钟前
@Iserlohn44 请您正面回答我的问题。
1,“有些人真的高潮了,终于找到了喷点了哈哈”这句话是否是在就事论事,是否是在提出”建设性的评论”?
2,对于这种不道德的行为楼下的嘲讽和批评是否是理所应当的?
3,对于[1]的不友好发言我反驳”只允许夸了是吧”是否是在就他的评论”就事论事”?
ugly 124
ugly 48 分钟前
我真的很烦说讲不买华为不爱国思想的人,这事本来就是一群爱国的人在网上表示自己支持中国支持国产,被一群不在乎爱不爱国的人放大成恶心,嘲讽。
Iserlohn44 125
Iserlohn44 47 分钟前
@ohwind 你看,指出你发言的问题就给说成了「对基本是非没有自己的判断」。稍微说句不好听的,你也太把自己当回事了。
twor2 126
twor2 43 分钟前
@ohwind 我知道哪里别扭了,逻辑错在哪里了
因为是华为的错(或者华为某些人),但你嘲讽的不是华为
yigecaiji 127
yigecaiji 41 分钟前
明明我们在嘲讽华为,怎么有人直接上升到民族和国家了
yunshansimon 128
yunshansimon 38 分钟前
华为干得好,什么道德之类的,都是西方国家制定的标准,作为强大如华为者,作为中国的代表,就是要打破西方制定的道德标准和底线,坚持填充垃圾,就是不改。看到华为这么流氓,我们中国人民就放心了!希望广大爱国程序员也学习华为,为华为的项目多多贡献垃圾!为建设伟大华为贡献自己的力量!
ohwind 129
ohwind 36 分钟前 ❤️ 1
@Iserlohn44 一边要求别人「就事论事」,一边回避我的提问,一边对我进行攻击。想必双重标准不外如是吧?我想孰是孰非已有结论,我们两个的讨论就此终止,我也不愿意与你浪费电力。
ioriwong 130
ioriwong 33 分钟前
无耻则无敌
polo3584 131
polo3584 29 分钟前
本来说的是 leizheng 这个开发者,然后就上升到了华为,然后上升到了国家和民族,真有意思。
libook 132
libook 27 分钟前
开源社区也是一个项目团队。

从项目管理的角度上来说,几乎所有问题都可以通过约定规则、流程来解决,所以有问题应该讨论一下:
1. 问题是否实际存在?
2. 影响范围如何?
3. 可以约定什么样的规则、流程来解决和避免这个问题?

华为员工有目的不纯的动机,邮件发送者也有“言外之意”的嫌疑(毕竟邮件里只有无证据的指控,而缺乏建设性)。

如果后续邮件没有人出来按照一个项目问题的正常解决流程来协调解决的话,那么项目管理本身可能是这个社区目前*大的问题。
zchlwj 133
zchlwj 27 分钟前 ❤️ 1
@phh 先有华为后有天的话 我在你这里*次看到
Iserlohn44 134
Iserlohn44 26 分钟前
@ohwind 不好意思,并非回避问题,而是没有看到你的第二条回复。我的上一条回复是针对你的 118 号评论。
针对你的问题:
1. 当然不是;
2. 无意义的嘲讽不应当,有道理的批评当然是应当的;
3. 并不是。用无逻辑去回应无逻辑,不代表你就是对的。

我发现你似乎把指出你的发言问题等价成了认为华为这件事做的对,甚至延伸到了「对基本是非没有自己的判断」,你不觉得太自以为是了吗?
tt67wq 135
tt67wq 22 分钟前
国内公司做开源的态度都有点问题,为了 KPI 一哄而上,KPI 有了就不维护了
miniwade514 136
miniwade514 21 分钟前
建议送进本站的精华版块(水深火热)
manzhiyong 137
manzhiyong 12 分钟前
这个作者真是丑陋,辱骂未开源提供贡献的人。
fanlis 138
fanlis 10 分钟前 ❤️ 1
进来看到前几排,以为进入 4V 社区
喷华为可以,随便喷,不要扯着你的破脸阴阳怪气中国,搁谁看不出来?
nmecury 139
nmecury 3 分钟前
@hwdef 我是某大型项目的使用者,用的时候发现了隐蔽的严重 bug,又不会修,只好提了个 issue,被打了 high-priority 的 tag,然后在大版本更新里被修复了。能不能请您说说我怎么恶心了?啥时候开源社区出了您这么一号大人物?

初级后端的疑惑,如何估算接口 qps,以及 redis 占用多少容量, nginx 能抗多少并发

如题,参与公司业务开发中,经常会遇到这样的问题:

这个业务入口会为接口带来多少的 qps 增长?
这个接口能抗住多少 qps ?
这个业务要上缓存的话,预计会带来多少缓存占用?
现有的 redis 能抗多少并发?内存占用是否过高?是否需要增加机器?
现有的 nginx 集群,能抗住多少并发?是否需要增加机器?
业务上线预计会带来 1000qps 的增长,服务器资源(接口,缓存,数据库)是否能扛得住?
这个业务的性能瓶颈在哪里?怎么查出来? 等等
总结的问题就是,大佬们是如何进行业务的容量评估,性能评估,性能排查的?

希望能有大大能逐点解答一下上面的 7 个问题你们在工作中是怎么去分析的,身为菜鸟的我每次遇到这种问题,都头痛半天,然后还是去问大佬怎么怎么弄,但是几次下来也没有总结到套路,都快怀疑自己适不适合干下去了…. 所以想向各位请教下,学习一下大家都是怎么评估和排查问题的,想在这方面有点成长,万分感谢!

第 1 条附言 · 1 小时 30 分钟前
看到有这么多人默默收藏了,就说明了其实还是有很多人关心这些问题的,看到这个问题的大佬们,有经验的希望还是能尽量分享下呀~ 求求了
qps 并发 Nginx Redis22 条回复 • 2021-06-21 16:24:07 +08:00
tachikomachann 1
tachikomachann 3 小时 9 分钟前 via Android
之前看《 java performance definitive guide 》时,作者在*章说过一句话。大概意思是很多人以为 java 调优就是这样一个按钮,我按下去了调优就完成了。实际上不是的,一个服务的性能瓶颈需要具体问题具体分析,需要结合业务场景,压测结果,profile 工具等一点一点地去分析。然后根据自己需要的性能目标和成本去得出一个折中方案。

lz 可以先看看相关的书籍,学习用一些基本工具(大厂甚至都有一整套自己的工具)和大牛们做性能分析的思路。然后在到自己项目里实践看看。
whcoding 2
whcoding 3 小时 7 分钟前
可以买阿里云的压测得到你想要的数据.
waibunleung 3
waibunleung 3 小时 1 分钟前
@tachikomachann 我知道肯定会有人说具体问题具体分析,但是问题都是是有分析方向的,就比如你怎么估计一个在服务首页下面增加一个功能入口,新业务增加多少 qps 呢?如果你通过接口监控,知道了这个首页的平均 qps 是 1000,运营告诉你,页面底部的点击率是 25%,那预计带来的 qps 就大约是 250qps,这个 qps 不算高,接口逻辑不复杂的话就能轻松扛过去等等

上面说的 转化率就是一个评估 qps 的方向。
导致性能瓶颈的问题有很多,但是排查瓶颈肯定是有套路的

至于你说学习大牛们做性能分析的思路,提出这个问题的我,就是希望能再这里收获一点思路。

感谢回复啦~
waibunleung 4
waibunleung 3 小时 0 分钟前
@whcoding 公司自建机房

想要问题分析的思路和套路,阿里云并不能告诉我预计业务会增长多少 qps…
dream4ever 5
dream4ever 2 小时 2 分钟前
之前也思考过这个问题,在*客时间买了几门架构设计方面的课,有些课程会讲到这类数据,比如在硬件配置不是瓶颈的情况下,nginx 能扛住多少并发,redis 能扛住多少并发之类的数据,可以看看。
dream4ever 6
dream4ever 2 小时 2 分钟前
而且也会讲如何排查性能瓶颈的方法。
janxin 7
janxin 1 小时 42 分钟前
估算都不知道瓶颈在哪怎么估算 orz

所以先做压测找到瓶颈
jmtung 8
jmtung 1 小时 35 分钟前
1 、性能:压测
2 、redis 内存占用: http://www.redis.cn/redis_memory
waibunleung 9
waibunleung 1 小时 31 分钟前
@dream4ever 请问买的是哪几门课程呢?
chenqh 10
chenqh 1 小时 28 分钟前
能上 100QPS 都好事了,

waibunleung 11
waibunleung 1 小时 26 分钟前
@jmtung 卧槽,有这个 redis 的预估神器?它估算是怎么估算的?
Maboroshii 12
Maboroshii 1 小时 25 分钟前 via Android
如果不是那种用户量特别大的服务,就随便搞一个配置,先上线,再观察调整也来得及,就能慢慢积累经验了
waibunleung 13
waibunleung 1 小时 23 分钟前
@Maboroshii 就是那种用户量大的服务
zed1018 14
zed1018 1 小时 21 分钟前
jmeter 可以压测
Maboroshii 15
Maboroshii 1 小时 17 分钟前
@waibunleung #13 压测是一个方案,不过具体还是依赖运营数据和现有数据对比,再考虑配置问题。 总有一个人有经验,任何项目也不是一上线就用户量爆炸的。
iyaozhen 16
iyaozhen 1 小时 6 分钟前
这个问题比较复杂。
往往大家只是说做个压测,但压测*难的不是 jmeter 啥的使用,而是压测场景的分析。

这个之前内部写了个文档,需要再重新写个,可能能回答楼主部分问题
waibunleung 17
waibunleung 56 分钟前
@Maboroshii 压测确实是一个方案,但是肯定有分析技巧和套路的
X0ray 18
X0ray 44 分钟前
性能评估看压测,
性能排查要做好 metrics 监控,如果有异常了,一拉图标出来很快就能反映出实际情况。
fantastM 19
fantastM 43 分钟前
1 和 2 应该都是先由产品 /运营给出一个预估的用户量,然后通过应用当前的部署情况(比如负载均衡了多少台机器,单台机器的配置,应用运行时的配置,接口的响应时间)估算出接口的 QPS 。
3 sizeof 可以算占用量,不过和具体缓存的数据有关,#8 提到的网站就挺不错。
4 单机的话,可以用 redis-benchmark 跑下看看。
7 压测时候看下各个调用链路里的耗时(或者更细一点的,可以自己打印 log ),还有外部依赖的监控指标等等,出现问题的话,总能看出一些端倪。
dream4ever 20
dream4ever 35 分钟前
@waibunleung 《架构实战案例解析》,《许式伟的架构课》,《从 0 开始学架构》,但是上面说的内容具体在哪个专栏里现在印象不深了。
waibunleung 21
waibunleung 24 分钟前
@iyaozhen 大佬可以简单回答一下,然后再把写好的文档分享一下~
waibunleung 22
waibunleung 23 分钟前
@fantastM 太棒了,就是需要类似这样的回复!还有请问下,类似于 4k qps mysql 能不能扛得住,会不会报警这种问题,要怎么思考呢?

11. 盛*多水的容器(JS实现)

11. 盛*多水的容器(JS实现)

1 题目
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳*多的水。

2 思路
该题使用首尾双指针向中间靠拢的办法,逐步比较面积大小

3代码
/**
* @param {number[]} height
* @return {number}
*/
var maxArea = function(height) {
var low = 0;
var high = height.length – 1;
var max = Math.min(height[low], height[high]) * (high – low);

while(low < high) {
if (height[low] < height[high]) {
low++;
} else {
high–;
}

max = Math.max(max, Math.min(height[low], height[high]) * (high – low));
}
return max;
};

15. 三数之和(JS实现)

15. 三数之和(JS实现)

1 题目
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

2 思路
这道题参考了题解,利用了排序 + 双指针 + 散列表去重,折腾了一晚上

3代码
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
var result = [];
var map = {};
var value;
var left, right;
var sum;
nums.sort(function(a,b){
return a-b;
});

if (nums[0] > 0 || nums[nums.length-1] < 0) return result;

for (var i=0; i<nums.length; i++){
left = i+1;
right = nums.length – 1;
while(left < right) {
sum = nums[i] + nums[left] + nums[right];
if (sum === 0) {
var key = ” + nums[i] + nums[left] + nums[right];
if (!map[key]) result.push([nums[i], nums[left], nums[right]]);
map[key] = true;
left++;
right–;
} else if (sum < 0){
left++;
} else {
right–;
}
}
}

return result;
};

16. *接近的三数之和(JS实现)

16. *接近的三数之和(JS实现)

1 题目
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target *接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target *接近的三个数的和为 2. (-1 + 2 + 1 = 2).

2 思路
这道题还是利用了排序 + 双指针的方法解决

3代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var threeSumClosest = function(nums, target) {
if (nums.length <= 3) {
return nums.reduce(function(prev, curr){
return prev + curr;
});
}
nums.sort(function(a, b){
return a-b;
})

var left,right;
var diff = target – nums[0] – nums[1] – nums[2];
var sum;

for (var i=0; i<nums.length; i++) {
left = i + 1;
right = nums.length – 1;
while(left < right) {
sum = nums[i] + nums[left] + nums[right]
if (Math.abs(diff) > Math.abs(target – sum)) { //注意这里对比的是*对值
diff = target – sum;
}
if (diff === 0) return target; //相加等于target,此时直接返回
if (target – sum > 0) {
left++;
} else {
right–;
}
}
}

return target – diff;
};

18. 四数之和(JS实现)

18. 四数之和(JS实现)

1 题目
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
示例:
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
满足要求的四元组集合为:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]

2 思路
这道题还是利用了排序 + 双指针 + 散列表去重的方法解决,与三数之和相比多加了一层循环

3代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number[][]}
*/
var fourSum = function(nums, target) {
if (nums.length < 4) return [];
nums.sort(function(a,b){
return a-b;
});

var map = {};
var result = [];
var sum;
var key;
var filterMap = {};
for (var i=0; i<nums.length-3; i++) {
if (i > 0 && nums[i] == nums[i-1]) continue;

var min = nums[i] + nums[i+1] + nums[i+2] + nums[i+3];
if (min > target) break; //*小的四个数加起来都太大,那么久彻底没戏了

var max = nums[i] + nums[nums.length-1] + nums[nums.length-2] + nums[nums.length-3];
if (max < target) continue; //当前数加上其余*大的三个数,仍然比较小,那么说明当前数太小了

for (var j=i+1; j<nums.length-2; j++) {
var left = j + 1;
var right = nums.length – 1;

while(left < right) {
sum = nums[i] + nums[j] + nums[left] + nums[right];
if (sum === target) {
key = ” + nums[i] + nums[j] + nums[left] + nums[right];
if (!map[key]) {
result.push([nums[i], nums[j], nums[left], nums[right]]);
map[key] = true;
}
left++;
right–;
} else if (sum > target) {
right–;
} else {
left++;
}
}
}
}

return result;
};

19. 删除链表的倒数第N个节点(JS实现)

19. 删除链表的倒数第N个节点(JS实现)

1 题目
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。

2 思路
这道题通过添加prev指针的方法,只完整遍历一次链表,就找到倒数的节点

3代码
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} n
* @return {ListNode}
*/
var removeNthFromEnd = function(head, n) {
var list = head;
var prev = head;
prev.prev = null;
var len = 1;
while(list.next) { //遍历并添加prev指针
list = list.next;
list.prev = prev;
prev = list;
len ++;
}

if (len < n) return head; //如果超出链表长度,直接返回原列表

while(–n > 0) { //找到倒数第n个节点
list = list.prev;
}

if (list.prev === null) { //如果是*个节点
return list.next;
} else {
if (n > 1) list.next.prev = list.prev; //*后一个节点要处理一下
list.prev.next = list.next;
return head;
}

};

22. 括号生成(JS实现)

22. 括号生成(JS实现)

1 题目
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

2 思路
这道题利用树的构造方法来枚举可能的情况,在枚举的过程进行剪枝操作,每个叶子节点就是*后的有效结果。注意生成过程中,表达式中左括号的数量始终小于等于右括号

3代码
/**
* @param {number} n
* @return {string[]}
*/
var generateParenthesis = function(n) {
function node(str, left, right) {
this.val = str;
this.leftChild = null;
this.rightChild = null;
this.left = left; //还剩余左括号的数量
this.right = right; //还剩余右括号的数量
}

function traverse(treeNode, result) {
let {left, right, val} = treeNode;

if (left === 0 && right === 0) { //括号用完,推入结果
result.push(val);
return;
}

if (left === 0 && right > 0) { //左括号用完,只能加右括号
treeNode.rightChild = new node(val + ‘)’, left, right – 1);
traverse(treeNode.rightChild, result);
return;
}

if (left === right) { //当前剩余的左括号和右括号数量相等,则新括号必须为左括号
treeNode.leftChild = new node(val + ‘(‘, left – 1, right);
traverse(treeNode.leftChild, result);
return;
}

if (left < right) { //其余情况既可以添加左括号,又可以添加右括号
treeNode.leftChild = new node(val + ‘(‘, left – 1, right);
traverse(treeNode.leftChild, result);
treeNode.rightChild = new node(val + ‘)’, left, right -1);
traverse(treeNode.rightChild, result);
}
}

const root = new node(‘(‘, n-1, n);
const result = [];
traverse(root, result);
return result;
};