首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么数组下标从 0 开始?而不是 1?

很多小伙伴初学编程的时候都被元素下标折磨过,为什么很多编程语言要把 0 作为第一个下标索引,而不是直观的 1 呢?...那么我们能够迅速的写出如下四个符合上述连续序列的不等式: 1)2 <= i < 13 2)1 < i <= 12 3)2 <= i <= 12 4)1 < i < 13 以上四个不等式均满足要求,那是否有理由选择其中的一种而不是另一种...遵循不等式 1 的规则: 当从下标 1 开始时,下标范围 1 ≤ i < N+1 当从下标 0 开始时,下标范围 0 ≤ i < N 哪个更优雅?...Dijkstra 是这样解释的:从下标 0 开始能够给出更好的不等式,因为元素的下标就等于序列中它前面的元素数(或者说 “偏移量”)。 问题解决!

90430
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?

    当我们想要写一个循环体,期望执行10次的时候,我们会使用以下方式: for (int i=0; i<10; i++){ } 可以看到,为了保证循环10次,我们定义了一个整数变量从0开始。...他认为,使用左闭右开的表达方式,当下标从 1 开始时,下标范围为 1 从 0 开始时则是 0 <= i < N; 而显然后面这种表达式更加漂亮、优雅一些。...计数表示偏移量 很多人学习编程都是从C语言开始的,那么,C语言就是一个典型的0-base语言(以0作为计数的开始),其实,这一约定早在BCPL时代就是这样的了。...在C语言还不叫C语言,还叫BCPL的时候,他的作者马丁·理察德就设计了数组从0开始的索引方式。...开始的(1-based indexing),而对Python语言有巨大影响的另一门语言,C语言的索引则是从0开始的。

    1.1K40

    数组下标为什么从0开始,而不是1?

    例如:二叉树,堆,图,等,是非线性表,是因为,在非线性表中,数据之间并不是简单的前后关系。 数组是如何随机访问数组元素? 数组是如何实现根据下标随机访问数组元素的吗?...低效的“插入”和“删除” 插入 插入:从最好O(1) 最坏O(n) 平均O(n) 什么时候会是O(1)?...将多次删除操作中集中在一起执行,可以先记录已经删除的数据,但是不进行数据迁移,而仅仅是记录,当发现没有更多空间存储时,再执行真正的删除操作,这样减少数据搬移次数节省耗时。...为什么数组要从 0 开始编号,而不是1? 从偏移角度理解a[0] 0为偏移量,如果从1计数,会多出K-1。增加cpu负担。...为什么循环要写成 for(inti=0;i而不是 for(inti=0;i<=2;i++)。

    6.3K10

    算法:插入排序详解--为什么从第二项开始,而不是第一项

    PS:对于插入排序这个算法,我们想要看清他就要从它的应用场景,概念,用法等去了解它,实现代码就那么几行,但有时还真是不好理解,比如说为什么从第二项开始,而不是从第一项开始呢,下面我们来举个例子看一下。...插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2) 1:插入排序 /** * 从第二项开始...:把第二项数据暂存,和第一项比较,如果第一项>第二项则调换, * 2:把第三项数据暂存,和第二项比较,如果第二项>第三项则调换, 这时调换后的第二项还要和第一项比较,然后再判断调换,从当前下标开始向左遍历凡是大于...* * * 很多人估计不理解为什么从第二项开始,而不是从第一项, * 这里我稍微做一下解释,插入排序就是将一个数据插入到已经排好序的有序数据中...,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序, * 我们对于一个数组,不知道哪里是排序好的,可能是前三条,也可能不是有序的,我们这时就要假设一段已经排好序的数组,我们直接取前三项的话

    1.2K60

    基础 | 正则表达式(JS)-入门篇2

    2>根据情况选择合适的括号能够叫逻辑更清晰,读者能清楚理解需要捕获的内容,而不用挨个数括号算作者到底想捕谁。 坏处:写法看着不够美观,增加了阅读难度,这个难度因人而异。...逗号应该加在“左边有数字,右边数字的个数正好是3的倍数的位置”,但是一般正则表达式都是从左向右工作的,这时就要用到“环视”了。...左侧文本 不支持 否定逆序环视 (?左侧文本 不支持 肯定顺序环视 (?=…) 子表达式能够匹配右侧文本 支持 否定顺序环视 (?!...例如[*]的*就不再是元字符了;而[-]的-还是元字符;^在[]就不是匹配开头了,而是取反的意思(这里就不一一列出了,主要是提个醒,大家用到时注意点。为什么不一一列出,你这个懒鬼!...2、在多数系统中,使用范围表示法而不是列出范围内的所有字符并不会影响执行速度(例如:[0-9]与[0123456789]是一样的。)相反,如果某些实现方法没有优化好的话,还会是范围表示法会快一些。

    27320

    「思维导图学前端 」初中级前端值得收藏的正则表达式知识点扫盲

    m 如果启用了标志m,正则表达式会执行多行匹配,^可以匹配每一行的开始或整个字符串的开始,而$可以匹配每一行的结束或整个字符串的结束。...要注意的是,|隔断的是其左右的整个子表达式,而不是单个普通字符。...先行:lookahead,必须满足前方的条件,条件在前方,前方等同于右侧。 后行:lookbehind,必须满足后方的条件,条件在后方,后方等同于左侧。 零宽正向先行断言(?...连续执行test()方法,后续的执行将会从lastIndex处开始匹配字符串。这种情况下,如果test()无法匹配到结果,lastIndex就会重置为0。...当还未进行匹配时,lastIndex自然是0,代表从第0个字符串开始匹配。

    45840

    Python爬虫抓取纯静态网站及其资源

    ,而不是-代表区间,*代表0到无穷次匹配,?代表0或1次匹配。...它们的工作流程如下: 肯定顺序环视:先找到环视中的文本在右侧出现的初始位置,然后从匹配到的右侧文本的最左的位置开始匹配字符 否定顺序环视:先找到环视中的文本在右侧没有出现的初始位置,然后从匹配到的右侧文本的最左的位置开始匹配字符...肯定逆序环视:先找到环视中的文本在左侧出现的初始位置,然后从匹配到的左侧文本的最右的位置开始匹配字符 否定逆序环视:先找到环视中的文本在左侧没有出现的初始位置,然后从匹配到的左侧文本的最右的位置开始匹配字符...默认的()中都指明了一个分组,分组序号为i,i从1开始,分别用re.search(reg, xx).group(i)来获取。 如果不想捕获分组可以使用(?:...)来指明。..., 36), match='hello world,hello python,hello world'> 由上可以看到它匹配的是hello world,hello python,hello world而不是刚开始的

    1.8K20

    如何利用Python抓取静态网站及其内部资源

    ,而不是-代表区间,*代表0到无穷次匹配,?代表0或1次匹配。...它们的工作流程如下: 肯定顺序环视:先找到环视中的文本在右侧出现的初始位置,然后从匹配到的右侧文本的最左的位置开始匹配字符 否定顺序环视:先找到环视中的文本在右侧没有出现的初始位置,然后从匹配到的右侧文本的最左的位置开始匹配字符...肯定逆序环视:先找到环视中的文本在左侧出现的初始位置,然后从匹配到的左侧文本的最右的位置开始匹配字符 否定逆序环视:先找到环视中的文本在左侧没有出现的初始位置,然后从匹配到的左侧文本的最右的位置开始匹配字符...默认的()中都指明了一个分组,分组序号为i,i从1开始,分别用re.search(reg, xx).group(i)来获取。 如果不想捕获分组可以使用(?:...)来指明。..., 36), match='hello world,hello python,hello world'> 由上可以看到它匹配的是hello world,hello python,hello world而不是刚开始的

    1.4K20

    正则断言有哪几种?正则如何实现与或非?

    仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。 例如,/w+(?=/d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。 2. (?!X) 零宽度负先行断言。...仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,/w+(?!/d) 与后不跟数字的单词匹配,而不与该数字匹配 。 3. (?<=X) 零宽度正后发断言。...仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。 例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。 4. (?<!X) 零宽度负后发断言。...仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。 例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配 5.非捕获组 (?...:),非捕获组,这个组没有编号,不能用来后向引用,只能当做断言。 (?

    66610

    Go小技巧&易错点100例(十六)

    本期看点:正文开始:切片的长度和容量在Go语言中,切片(slice)是一个引用类型,它是对底层数组的抽象表示,提供了动态长度的、灵活的序列类型。...容量(Capacity) :切片的容量是指从切片的第一个元素开始,到底层数组中最后一个元素之间的元素个数。换句话说,容量表示在不重新分配底层数组的情况下,切片可以容纳的元素的最大数量。...当你在for循环中使用defer时,有几个关键点需要注意:延迟执行:defer语句中的函数会在包含它的函数返回前被调用,而不是在defer语句被执行时立即调用。...这样做可以确保每个defer语句捕获并记住它自己的i值,并在稍后打印出来。...需要注意的是,strings.TrimLeft只删除字符串左侧的字符,而不会对字符串的右侧进行任何操作。

    15810

    50道JavaScript详解面试题,你需要了解一下

    在Line2中,我们使用===运算符来检查两个字符串基元而不是字符串对象,因此我们得到True。 5、控制台输出是什么,为什么? 与之前的问题类似,我们比较了两个唯一的对象。...instanceof需要TypeScript,而typeof则不需要。 typeof在右侧使用变量名称, instanceof在左侧和右侧使用值,而不是。...当左侧操作数为null或未定义时,它将返回右侧操作数。 16、getElementsByTagName是JavaScript函数吗?...用简单的话来说,嵌套的catch仅捕获其作用域及其以下范围内的故障,而不捕获嵌套范围之外的链中较高的错误。 22、控制台输出是什么,为什么?...event.currentTarget随着事件起泡而变化,event.target保持不变。 41、Array sort()方法的默认排序是什么? 按字符值从最小到最大。 42、什么是比赛条件?

    3.5K40

    一款基于中间人攻击用于偷窥HTTPs网站流量的秘密代理工具

    而对于 HTTPS(2) 连接来说,中间人想要冒充服务端,必须拥有对应域名的证书私钥,而攻击者要拿到私钥,只能通过这些手段:1)去网站服务器上拿;2)从 CA 处签发证书;3)自己签发证书。...要防范前两点,需要网站做好各个方面的安全防护,从主机安全到网站安全(避免私钥被盗),从域名解析安全到域名邮箱安全(避免攻击者重签证书)。...tab页面,查看右侧的Frames,你会发现你刚刚发生的消息在这里全部显示出来了。...图片0x8 场景三: 重放数据选中左侧条目,拖动到右侧,然后就可以在右边红色方框中看到选中数据包的详情,我们可以在Composer菜单项中修改请求体,对改次请求就行重放。...这个方法常用于软件开发过程中的网络接口调试使用,尤其在操作路径很长的场景中,有了这个工具,我们可以很便捷的从中间步骤开始测试,而不是一次失败后,全部重新开始。

    4.8K53

    VBA实战技巧30:创建自定义的进度条2

    有创意的进度条 采用相反的方式来显示进度,将使用标签“缩小”而不是“增长”。诀窍是我们的标签不是进度的指示器。相反,有一个指示进度的静态图像,而标签将充当静态图形隐藏部分的遮罩,如下图5所示。...百分比显示 添加一个文本框对象(如下图7所示)并更改其标题(Caption)属性,而不是插入框架对象并更改标题属性。 图7 其灰色背景是一个插入的Image对象,它指向一个带有灰色边框的简单图像。...将计算标签的左侧而不是将Left属性固定到设置位置。逻辑是从230(标签的最右侧)中减去计算出的Width。例如,如果Pct为0.5,则计算出的Width为 109,则Left属性计算结果为121。...2行开始粘贴你的实体代码."...startrow + 1) Call UpdateProgress(Pct) '这是工作簿执行许多需要一些时间的事情的地方 startTime = Timer ' 捕获当前时间

    1.2K20

    Microsoft Edge有哪些你不知道却超级好用的插件?(Microsoft Edge功能测评)

    这让用户可以更专注于网站的内容,而不会因为浏览器的干扰而分心。这点还是比较满意的. 同时,Edge浏览器的界面整体设计也让人感到非常简洁、自然。...使用鼠标进行操作:(简单粗暴) 直接通过拖曳窗口标题栏,将窗口拖至"左侧"或者"右侧",当界面出现透明的半个屏幕时,松开鼠标即可 分屏按钮: 在Edge浏览器窗口顶部的标题栏上,将光标移至其右上角的"最大化...2.2 网页捕获 在Windows 11的Edge浏览器中,网页捕获功能被称作“网页截图”,可以帮助用户抓取整个页面、选定区域或整个页面的下拉部分,具体操作步骤如下: 方法一: 在Edge浏览器中打开需要截图的网页...页面上方最右侧(账户按钮右侧)的"…“按钮,下拉菜单选择"网页捕获按钮”....界面展示: 四、总结 Edge 作为微软开发的浏览器,微软对 Edge 浏览器的开发十分重视,从设计到功能到性能等都经过了精心打造和不断改进。

    1.5K31
    领券