作者 | 佩奇
出品 | 区块链大本营(blockchain_camp)
近日,福布斯发布 “Forbes 30 Under 30 Asia 2019” 金融和风险投资类榜单。
放眼望去,这是一份只有90后的青年才俊榜单,
这是一份女性占据1/3(足足11位!!)的榜单,
这是一份区块链青年才俊霸榜的榜单...
火币实验室董事 David Gan、Amber AI 团队、CoinGecko 团队、Sora Ventures 创始人 Jason Fang、Asobica 首席执行官 Koya Imada、Terraform Labs 联合创始人 Do Kwon 和 FutureMoney 创始人 Steven Li 共7位30岁以下区块链行业精英,也正式大步跨进了 top 30 榜单之内。
无论是从技术革新到颠覆传统产业,还是展现出巨大天赋与统治世界舞台的潜力,这群青年才俊正在各行各业、用不同方式挥尽才能打拼出一片天。
如果你正在寻找马云、马化腾、李彦宏、雷军等成功前辈的接班人,这份榜单绝对算是一份权威的人才指南。
那么,在这份榜单中都有哪些比你优秀比你努力还比你年轻的90后呢?营长老铁们做了精心的梳理,一起来看吧!
11位美女,有颜、有才,有头脑
Tiantian He
Sequoia Capital China 副主席
2015年,Tiantian He 在高盛工作三年后加入红杉资本中国有限公司。她现在是这家投资公司的副总裁,专注于早期技术和媒体公司。她参与了30多笔交易,包括红杉资本投资中国的廉价购物平台 Pinduoduo,以及在香港上市的电子商务公司美团大众点评。她还帮助该公司在韩国的投资,在那里她参与了当地食品外卖创业公司 Woowa Brothers。
Gitta Amelia
EverHaus 创始人
2017年从宾夕法尼亚大学沃顿商学院毕业后,Gitta Amelia 创办了 EverHas,这是一家投资500万美元的早期风险投资公司。2018年,根据交易数量,EverHa 被 Crunchbase 评为印度尼西亚最活跃的种子轮公司。Amelia 看好印尼的企业和工业技术,目前已筹集第二笔3000万美元的资金。她之前创办了《 Think Nusantara 》 ,这是一本面向印尼青年的在线出版物,旨在讨论印尼的整体发展。
Cathryn Chen
MarketX Ventures 创始人
在目睹了无法投资于上市前公司的中国投资者的沮丧情绪后,前投资银行家 Cathryn Chen 创办了 MarketX。该公司为缺少服务的亚洲投资者提供了一个跨境平台,使他们能够购买 Palantir、滴滴出行和 Lyft 等公司的股票。已筹集160万美元的种子基金,并与200个家族办公室合作。Chen 目前正在筹集 MarketX 特殊机会基金,这是一个1.5亿美元的后期基金,主要投资于已经达到独角兽地位的公司。
Sarah Chen
The Billion Dollar Fund for Women 联合创始人
Sarah Chen 是 The Billion Dollar Fund for Wome 的投资者和联合创始人,该基金的最终目标是为女企业家创办的公司筹集10亿美元的资金。她的主要目标是解决女性创始人所面临的性别融资歧视。到2020年,她希望在女性驱动的创业公司中投资10亿美元。迄今为止,她已经从全球投资者那里获得了超过7.5亿美元的认捐,这些投资者包括戈壁合伙人、金门风险投资公司、Rethink Impact、Springboard Growth Capital、Backstage Capital 和 Different Funds。
Joolin Chuah
Insignia Ventures Partners 合伙人
Joolin Chuah 是 Insignia Ventures Partners 的合伙人,并在2018年的近10项投资中发挥了重要作用,包括有前途的创业公司,如 igloohome、CoHive 和 Sayurbox。她是东南亚许多企业家的首选顾问,也是越南机器顾问平台 Finhay 的董事会成员。 在南洋理工大学获得了 MBA 学位。
Rashmi Kwatra
Sixteenth Street Capital 创始人
Rashmi Kwatra 是总部位于新加坡的对冲基金 Sixteent Street Capital 的创始人兼首席信息官。 在创立自己的基金之前,Kwatra 是 Prince Street Capital Management 最年轻的合伙人。 Prince Street Capital Management 是一家规模20亿美元的对冲基金,在纽约和新加坡设有办事处。她负责管理在南亚和东南亚的6亿美元投资,并被《Hedge Fund Journal》评为2018年50位对冲基金领军女性之一。
Hau Ly
500 Startups Vietnam 经理
Hau Ly 是 500 Startups Vietnam 公司最资深的非合伙人投资者。作为一个多产的风险投资家,她已经帮助该基金在40个创业公司中投资了300万美元,这些公司在接下来的几轮融资中已经筹集了超过1亿美元。2019年,Ly 将领导 Saola Accelerator 的运营,Saola Accelerator 是 500 Startups Vietnam 和韩国领先零售商 GS Shop 的合作伙伴。
Windy Natriavi
Awantunai 联合创始人
在 Go-Jek 和麦肯锡工作数年后,Windy Natriavi 找到了一个利基市场,为被排除在印尼金融体系之外的1亿人提供服务。2017年,她与人共同创办了 AwanTunai,这是一家金融科技初创企业,为微型商户提供营运资金,并为无银行账户的借款人提供消费贷款。作为 PayPal 新加坡孵化器项目的成员,AwanTunai 已经处理了30万份贷款申请,并向3000个微型商户提供了流动资金贷款。她最近从 Insignia Ventures Partners 和其他投资者那里获得了430万美元的 A 轮融资。
Ellen Nio
Patamar Capital 投资助理
Ellen Nio 是 Patamar Capital 的合伙人,Patamar Capital 是一家拥有近4000万美元的影响力基金。在她的职责中,她带领公司通过一个200万美元的基金和一个为期四个月的能力建设项目,在印度尼西亚和菲律宾投资女性主导的创业公司。Nio 还领导 SheVC Indonesia,这是一个为有抱负的女性风险资本家提供公开对话和指导机会的平台。在加入 Patamar 前,Nio 是雅加达智能城市计划的主管,她直接向雅加达总督报告。
Germaine Tan
Found8 企业发展与创新主管
Germaine Tan 是新加坡最大的企业家合作社区 Found8 的区域增长和投资的负责人,也是首席执行官的得力助手。Found8拥有3500名会员和校友,在三个校区拥有300多家初创企业和规模化公司。在过去四年里,他们共筹集了2.5亿美元的资金。Tan 还管理着一家100万美元的种子基金 Found Ventures,这是一家罕见的全由女性组成的公司,专门投资东南亚地区处于早期创业阶段的企业。
Jing (Stella) Zhao
Lightspeed China Partners 投资副总裁
Zhao Jing 是光速中国创业投资基金的副总裁,她专注于中国的零售、社交媒体、电子商务和娱乐行业;她之前投资过便利店连锁店猩便利和社交零售平台贝壳优品。之前,赵是腾讯即时通讯服务微信的产品经理。
同样是做区块链
凭什么这些男人会成功?
Amber AI
联合创始人, Amber AI
Amber AI 集团成立于2017年,是一家总部位于香港的数字货币交易所。他为基于加密货币的期货,期权和掉期交易产品提供交易。据该公司称,其每日营业额高达2亿美元。尽管数字货币的波动性很大,Amber AI 还是成功在一些基金中获得了回报。
CoinGecko
CoinGecko 联合创始人
2014年,Bobby Ong 和 TM Lee 共同创立了 CoinGecko,这是一个加密货币数据聚合器,可以跟踪价格、数量、社交和开发者统计数据。该公司与加拿大西部大学和柏林洪堡大学合作开展加密货币研究。Coingecko 声称其年收入为300万美元,跟踪了来自259家交易所的超过3587个代币。
Jason Fang
Sora Ventures 创始人
Jason Fang是 Sora Ventures 的联合创始人兼管理合伙人。该公司声称是亚洲第一个加密货币支持基金,自2018年1月推出以来,已筹集了3000万美元的资产。他投资80% 的资金在区块链和数字货币项目。 到目前为止,Sora Ventures 已经支持了超过12家初创公司,包括去中心化的视频内容平台 Mithril 和基于区块链的游戏平台 Alphaslot。
David Gan
Huobi Labs 董事
David Gan 是火币实验室董事,该实验室是早期区块链项目的孵化器。由中国最大的数字外汇交易平台火币交易所推出,目前已有15个项目和20多个正在筹备中。在此之前,Gan 是火币资本的高级董事,火币资本是一家投资机构,现在其10亿美元总资产的一部分投资于区块链和数字货币领域。在加入火币之前,Gan 曾为摩根士丹利和中国启明创投工作。
Koya Imada
Asobica CEO
2018年,Kota Imada 推出了这款狂热应用程序,用户可以交换虚拟货币来支持无人机比赛等活动,并购买商品和服务。 现在的社区有大约250个人和组织。在一次失败的音乐活动中负债累累,并发现了众筹个人项目的艰辛过程后,Imada 受到启发,创建了这个平台。
Do Kwon
Terraform Labs 联合创始人
Kwon 共同创立了 Terra 使用区块链技术来开发一个更有效的支付系统。以其名字命名的价格稳定的加密货币,或称为 stablecoin,在2018年1月推出时吸引了4000万用户与该公司合作。为了建立一个基于区块链的支付系统,Terra 已经从 Binance、 Arrington XRP 和 Polychain Capital 等传统巨头那里筹集了3200万美元,并组建了一个包括韩国票务巨头 Ticketmonster 和旅游服务商 Yanolja 在内的商业合作伙伴联盟。
Siyu (Steven) Li
FutureMoney 创始人
Li 是 FutureMoney 的创始合伙人之一。该投资公司成立于2017年,目前管理着4000万美元的总资产,并投资于前沿技术以及区块链相关项目。未来货币目前的投资组合包括区块链交易平台 QuarkChain、数据和机器学习网络 DxChain 和去中心化礼品平台 GIFTO。Li 拥有皇后大学工商管理硕士学位。
基金、投资、趣头条与链家
绝不能忘掉他们
Liu Yuan
真格基金董事总经理
刘元是真格基金的董事总经理,真格基金是一家投资公司,2011年由徐小平共同创办。刘关注的是处于早期阶段的中国科技创业公司,他曾主导过对多家公司的投资,其中包括中国自动驾驶汽车制造商 Momenta、在线零售商 y23和广播应用 Castbox。他拥有华盛顿与李大学的会计和商业学士学位。
Payfazz
Payfazz 联合创始人
2016年,Hendra Kwik,Jefriyanto 和 Ricky Winata 共同创立了 Payfazz,这是一个金融技术平台,旨在为印度尼西亚农村没有银行账户的居民实现普惠金融。他们在没有银行账户的用户和金融机构之间充当中间人,自成立以来已为大约1000万人提供服务。该公司已经筹集了2130万美元的资金,是第一家进入美国种子加速器 Y Combinator 的印度尼西亚公司。
Erdenetulga Rentsen
RVJ Capital 副总裁
在摩根士丹利(Morgan Stanley)位于纽约的自然资源集团工作时,Erdenetulga Rentsen 受到启发,希望帮助蒙古实现经济多元化,摆脱对大宗商品的依赖。在回到蒙古加入 RVJ Capital 之后,Rentsen 确定并领导了一些大型投资项目,比如建立一个羊绒加工厂,以及在乌兰巴托新机场附近修建一座大型酒店。在布朗大学读本科期间,Rentsen 是罗德岛州排名第一的国际象棋手;他计划在2019年秋天到哈佛大学攻读 MBA 学位。
Wu Ge
Gaorong Capital 副总裁
Wu Ge 是总部位于北京的投资公司高榕资本的副总裁,该公司管理着8只基金,承诺资本总额为17亿美元。 在他在 Gaorong 的5年任期内,他投资了许多中国科技公司,包括广播平台 Huya (成功在纽约证交所上市)和医疗保健网站 iASK。 拥有哥伦比亚大学国际经济与政治硕士学位。
Akshay Bajaj
Susquehanna International Group 风险投资家
Akshay Bajaj 是总部位于香港的海纳国际集团的技术投资者,他专注于东南亚金融技术、市场和软件服务领域的年轻创业公司。他已经管理了超过5000万美元的20项投资,包括对时尚电子商务公司 Zilingo 和经济型酒店平台 RedDoorz 的早期投资。Bajaj 与创始人在战略、伙伴关系、运营和融资方面密切合作,并担任 SIG 中国和东南亚投资组合公司之间的联络人。
Adam Bao
Cherubic Ventures 副总裁
作为 Cherubic Ventures 的副总裁,Bao 从2.5亿美元的种子基金中投资中国和美国有前途的创业公司,并且是带领公司进军东南亚的团队的一员。他还创办了 The Harbinger,这是一个英语播客和博客,主要采访中国前沿公司创始人和风险资本家。Bao 毕业于耶鲁大学,据说参加过《非诚勿扰》节目。
Fridtjof Berge
Antler 联合创始人
Fridtjof Berge 是 Antler 公司的联合创始人和首席运营官,Antler 公司是一家初创企业和早期风险投资公司。自2017年在新加坡推出以来,Antler 已经扩展到欧洲和澳大利亚。在从 Lippo 集团的 John Riady 和 Spotify 的首席技术官 Andreas Ehn 那里筹集到种子基金后,该公司目前正在筹集数百万美元的东南亚基金,投资于通过该项目成立的公司。Berge 曾是任职麦肯锡公司顾问,拥有哈佛 MBA 学位,此前曾是挪威医疗科技公司 Legevisitt 创始团队的成员之一。
Jeremy Berger
Arival Bank 联合创始人
Berger 是风险投资支持的数字银行创业公司 Arival Bank 的联合创始人和首席运营官。从南佛罗里达大学毕业后,他从事企业投资和财富管理工作,然后转向金融科技和初创企业。他认为,2018年2月推出的 Arival 是第一家面向中小企业的数字金融科技银行。Berger 还是 Life.Sreda 的投资组合总监,该公司自称是东南亚首批金融科技风险投资基金之一。迄今为止,sreda 已经在美国、欧洲和东南亚进行了超过20项投资,其中7项已经退出。
Cai Ziwen
InnoVision Capital 联合创始人
Cai Ziwen 在伦敦的私募股权行业开始了他的职业生涯,在牛津大学获得金融硕士学位后,他曾在罗斯柴尔德家族工作。2016年,Cai 回到中国,与人共同创立了 InnoVision Capital。该公司目前管理着超过4亿美元的资产,投资于中国的消费者和技术市场。Cai 负责管理创新视野对中国初创企业的投资,包括新闻聚合应用趣头条和房地产公司链家。
Benjamin Dunphy
Blue Sky Funds 投资总监
Ben Dunphy 是 Blue Sky 风险投资公司的投资总监,也是该公司投资委员会的成员。和他的同事 Elaine Steadhas 一起,Dunphy 通过三个基金筹集了超过1.75亿美元的承诺资本。他们最近的一次投资是在印尼的金融科技公司 Akulaku,Blue Sky 是这家初创公司的第一个非中国大陆投资者。
Youssef El Kaddioui
Mettā 创新合伙人
Youssef El Kaddioui是香港Metta的创新合作伙伴,Metta是企业家的成员俱乐部。他在谷歌开始了他的职业生涯,在那里他建立了他的第一个硬件企业,然后参加了一年一度的网络峰会,世界上最大的科技会议之一;在那里,他负责欧洲的次级活动和香港的 RISE 的投资者关系。然后他创立了 The Bridge VC,在那里他培养了一些有指导和资金渠道的创业公司。 迄今为止,他已经帮助创业公司筹集了10亿美元的资金。
Htet Arkar Kyaw
Giant Pay 创始人
Htet Arkar Kyaw 是跨平台移动支付初创公司 GiantPay 的联合创始人和首席运营官。巨额支付旨在减轻缅甸对非正规贷款的依赖,通过允许店主使用单一应用程序接受诸如借记卡、信用卡和移动支付等数字支付。2019年,Kyaw 的联合创始人因家庭原因离开公司后,巨额支付与缅甸领先的教育科技初创企业 ConceptX 建立了合作关系。
老铁们,努力吧!!!
免费技术公开课报名啦~
搞定区块链安全问题 | 挑战高薪区块链工程师
推荐阅读:
猛戳"阅读原文"有惊喜哟!
老铁在看了吗??
一、题目描述——缺失的第一个正数
给你一个未排序的整数数组 nums
,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n)
并且只使用常数级别额外空间的解决方案。
示例 1:
ini 代码解读复制代码输入: nums = [1,2,0]
输出: 3
解释: 范围 [1,2] 中的数字都在数组中。
示例 2:
ini 代码解读复制代码输入: nums = [3,4,-1,1]
输出: 2
解释: 1 在数组中,但 2 没有。
示例 3:
ini 代码解读复制代码输入: nums = [7,8,9,11,12]
输出: 1
解释: 最小的正数 1 没有出现。
提示:
1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
二、思考历程
1. 初见题目:排序法(天真版)
拿到题目,一看是无序整数数组,要求第一个缺失的正整数。
第一反应:排序!排完序后,第一个缺失的正整数不就是 nums[0] - 1
吗?
内心OS:这也太简单了吧,无趣无趣……
然而:题目要求 O(n) 时间复杂度,而排序至少 O(n log n) ,直接GG。
结论:排序法不可行,得另寻他法。
2. 优化思路:哈希表(Set)
既然不让排序,那就用 Set 存储所有数字,然后从 1 开始查找第一个不在 Set 里的数。
代码
ini 代码解读复制代码var firstMissingPositive = function(nums) {
const set=new Set(nums)
for(let i=1;i<=100000000000;i++){
if(set.has(i)) continue;
return i;
}
};
优点:时间复杂度 O(n) (Set 查找是 O(1))。
缺点:额外 O(n) 空间,总觉得i<=100000000000怪怪的...
3. 关键突破:利用数组长度信息
突然想到:缺失的正整数一定在 [1, n+1]
范围内(n = 数组长度)。
- 如果数组包含
1
到n
,那缺失的是n+1
。 - 否则,缺失的一定在
[1, n]
之间。
优化点:
- 可以减少循环次数
- 只需检查
[1, n]
范围内的数字。
代码优化(伪代码):
ini 代码解读复制代码var firstMissingPositive = function(nums) {
let len=nums.length;
const set=new Set(nums)
for(let i=1;i<=len+1;i++){
if(set.has(i)) continue;
return i;
}
};
内心OS:这下总该最优了吧?
4. 终极优化:循环次数再次减少
虽然现在是遍历了len次,但是能不能再少一点?
思路:如果我便利到的数组元素满足nums[i]>nums.length的话,岂不代表我又可以少循环一次了吗
步骤:
- 若发现存在元素nums[i]>nums.length,执行len--
代码
ini 代码解读复制代码var firstMissingPositive = function(nums) {
let len=nums.length;
const set=new Set(nums)
for(let i=1;i<=len+1;i++){
if(nums[i]>nums.length) len--;
if(set.has(i)) continue;
return i;
}
};
内心OS:这下肯定最优了!
5. 残酷现实:只击败 33% 的解法
自信提交,结果:只击败 33% 的解法 😱
三、最优题解
我败了没关系,AI大人会救我
我:"给出该算法题js最优题解"
AI:"收到!....."
js 代码解读复制代码var firstMissingPositive = function(nums) {
const n = nums.length;
// 1. 检查 1 是否存在。若不存在,则答案为 1。
if (!nums.includes(1)) {
return 1;
}
// 2. 将负数,0,以及大于 n 的数替换为 1。
// 在转换之后,nums 只会包含正数。
for (let i = 0; i < n; i++) {
if (nums[i] <= 0 || nums[i] > n) {
nums[i] = 1;
}
}
// 3. 使用索引作为哈希键,数组元素作为哈希值。
// 例如,如果 nums[1] = 3,表示数字 3 出现在数组中。
// 同时,将索引 3 位置的数字变为负数,以标记数字 3 出现过。
for (let i = 0; i < n; i++) {
let a = Math.abs(nums[i]);
// 如果见到数字 a,则将索引 a 对应的元素变为负数。
// 小心重复元素,只赋值一次。
if (a <= n) {
nums[a - 1] = - Math.abs(nums[a - 1]);
}
}
// 4. 再次遍历数组。返回第一个正数元素的索引 + 1。
for (let i = 0; i < n; i++) {
if (nums[i] > 0) {
return i + 1;
}
}
// 5. 如果 nums = [1, 2, 3],则缺少 4。
return n + 1;
};
核心思想
利用数组自身的索引作为哈希键,通过将对应的元素标记为负数来表示该数已存在,从而在O(n)时间内找到缺失的最小正整数。
详细步骤
-
初步检查:
- 如果数组中没有
1
,则结果一定是1
,直接返回。
- 如果数组中没有
-
数据清洗:
- 将所有小于等于
0
和大于n
(数组长度)的数替换为1
。这样保证数组中的值都在1
到n
的范围内,并且不影响后续hash标记步骤 。
- 将所有小于等于
-
原地Hash标记:
-
遍历数组
nums
:- 对于每个元素
nums[i]
,计算其绝对值a = Math.abs(nums[i])
。 - 如果
1 <= a <= n
,则将nums[a - 1]
变为其绝对值的负数。 这样做相当于标记了数字a
在数组中出现过。注意,需要先取绝对值,因为可能之前已经被标记为负数了。
- 对于每个元素
-
-
寻找结果:
-
再次遍历数组
nums
:- 找到第一个正数
nums[i]
。 此时,i + 1
就是缺失的最小正整数。 直接返回i + 1
。
- 找到第一个正数
-
-
特殊情况:
- 如果遍历到最后全部是小于等于0 的数,代表缺失的是
n + 1
,直接返回。 说明数组包含了从1
到n
的所有正整数。
- 如果遍历到最后全部是小于等于0 的数,代表缺失的是
动态题解示意图(运行该代码即可获得动态题解)
html 代码解读复制代码html>
<html>
<head>
<meta charset="UTF-8">
<title>第一个缺失的正整数 - 可视化解析title>
<style>
.container {
display: flex;
flex-direction: column;
align-items: center;
font-family: Arial, sans-serif;
max-width: 800px;
margin: 0 auto;
}
.array-container {
display: flex;
margin: 20px 0;
}
.array-element {
width: 50px;
height: 50px;
border: 1px solid #333;
display: flex;
justify-content: center;
align-items: center;
margin: 0 5px;
position: relative;
background-color: #f5f5f5;
}
.index {
position: absolute;
top: -20px;
font-size: 12px;
color: #666;
}
.highlight {
background-color: #ffeb3b;
transition: background-color 0.3s;
}
.marked {
background-color: #4caf50;
color: white;
}
.negative {
background-color: #f44336;
color: white;
}
.controls {
margin: 20px 0;
}
button {
padding: 8px 16px;
margin: 0 5px;
cursor: pointer;
}
.explanation {
background-color: #e3f2fd;
padding: 15px;
border-radius: 5px;
margin: 10px 0;
width: 100%;
}
style>
head>
<body>
<div class="container">
<h2>第一个缺失的正整数 - 可视化解析h2>
<div class="controls">
<button id="prev-btn">上一步button>
<button id="next-btn">下一步button>
<button id="reset-btn">重置button>
div>
<div class="explanation" id="explanation">
点击"下一步"开始算法演示...
div>
<div class="array-container" id="array-container">div>
<h3>算法步骤说明:h3>
<ol>
<li>检查1是否存在,若不存在则直接返回1li>
<li>将所有非正数和大于n的数替换为1li>
<li>使用索引作为哈希键,将出现过的数字对应的索引位置标记为负数li>
<li>扫描数组,第一个正数位置的索引+1就是缺失的正整数li>
<li>如果全部为负数,则返回n+1li>
ol>
div>
<script>
const nums = [3, 4, -1, 1]; // 示例输入
let step = 0;
let workingArray = [...nums];
let highlightedIndex = -1;
function renderArray() {
const container = document.getElementById('array-container');
container.innerHTML = '';
for (let i = 0; i < workingArray.length; i++) {
const element = document.createElement('div');
element.className = 'array-element';
if (i === highlightedIndex) {
element.classList.add('highlight');
}
if (workingArray[i] < 0) {
element.classList.add('negative');
}
element.innerHTML = `
${i}
${workingArray[i]}
`;
container.appendChild(element);
}
}
function updateExplanation() {
const explanation = document.getElementById('explanation');
switch(step) {
case 0:
explanation.innerHTML = `
初始数组: [${nums.join(', ')}]
准备开始处理...
`;
break;
case 1:
explanation.innerHTML = `
步骤1: 检查数组中是否存在1
${nums.includes(1) ? '数组包含1,继续处理' : '数组不包含1,直接返回1'}
`;
break;
case 2:
explanation.innerHTML = `
步骤2: 将所有非正数和大于n的数替换为1
处理后的数组: [${workingArray.join(', ')}]
`;
break;
case 3:
explanation.innerHTML = `
步骤3: 使用索引作为哈希键
当前处理元素: nums[${highlightedIndex}] = ${workingArray[highlightedIndex]}
将索引 ${Math.abs(workingArray[highlightedIndex])-1} 位置标记为负数
`;
break;
case 4:
explanation.innerHTML = `
步骤4: 扫描数组寻找第一个正数
当前检查索引: ${highlightedIndex}
${workingArray[highlightedIndex] > 0 ?
`找到第一个正数位置,返回 ${highlightedIndex+1}` :
'继续扫描...'}
`;
break;
case 5:
explanation.innerHTML = `
步骤5: 所有位置都为负数,返回n+1 (${workingArray.length+1})
`;
break;
case 6:
const missing = findMissing();
explanation.innerHTML = `
算法完成!
第一个缺失的正整数是: ${missing}
`;
break;
}
}
function findMissing() {
for (let i = 0; i < workingArray.length; i++) {
if (workingArray[i] > 0) {
return i + 1;
}
}
return workingArray.length + 1;
}
function nextStep() {
if (step === 0) {
step = 1;
highlightedIndex = -1;
} else if (step === 1) {
if (!nums.includes(1)) {
step = 6; // 直接跳到结果
} else {
step = 2;
// 执行步骤2
for (let i = 0; i < workingArray.length; i++) {
if (workingArray[i] <= 0 || workingArray[i] > workingArray.length) {
workingArray[i] = 1;
}
}
}
} else if (step === 2) {
step = 3;
highlightedIndex = 0;
} else if (step === 3) {
// 执行步骤3
const a = Math.abs(workingArray[highlightedIndex]);
if (a <= workingArray.length) {
workingArray[a - 1] = -Math.abs(workingArray[a - 1]);
}
highlightedIndex++;
if (highlightedIndex >= workingArray.length) {
step = 4;
highlightedIndex = 0;
}
} else if (step === 4) {
if (workingArray[highlightedIndex] > 0) {
step = 6;
} else {
highlightedIndex++;
if (highlightedIndex >= workingArray.length) {
step = 5;
}
}
} else if (step === 5) {
step = 6;
}
renderArray();
updateExplanation();
}
function prevStep() {
if (step > 0) {
step--;
// 重置数组到上一步状态
resetWorkingArray();
// 设置高亮索引
if (step === 3) {
highlightedIndex = Math.min(highlightedIndex, workingArray.length - 1);
} else if (step === 4) {
highlightedIndex = 0;
} else {
highlightedIndex = -1;
}
renderArray();
updateExplanation();
}
}
function resetWorkingArray() {
workingArray = [...nums];
if (step >= 2) {
// 重新执行步骤2
for (let i = 0; i < workingArray.length; i++) {
if (workingArray[i] <= 0 || workingArray[i] > workingArray.length) {
workingArray[i] = 1;
}
}
}
if (step >= 3) {
// 重新执行步骤3
for (let i = 0; i < workingArray.length && i < highlightedIndex; i++) {
const a = Math.abs(workingArray[i]);
if (a <= workingArray.length) {
workingArray[a - 1] = -Math.abs(workingArray[a - 1]);
}
}
}
}
function reset() {
step = 0;
workingArray = [...nums];
highlightedIndex = -1;
renderArray();
updateExplanation();
}
document.getElementById('next-btn').addEventListener('click', nextStep);
document.getElementById('prev-btn').addEventListener('click', prevStep);
document.getElementById('reset-btn').addEventListener('click', reset);
// 初始渲染
renderArray();
updateExplanation();
script>
body>
html>
四、结语
再见!
评论记录:
回复评论: