首页
学习
活动
专区
工具
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

    详细设计一个文章页目录插件

    因为我们都习惯从上到下从左到右的去浏览文章,所以我希望首先映入眼帘的是文章内容而不是文章目录;另外因为我的博客的首页和文章列表页都是左侧是浏览区域而右侧是操作区域,所以把目录放到右侧能保持整站的布局统一以及操作的便利性...随着页面的滚动,目录将从头滚到尾,那么滚动的范围是从第一个子目录贴着滚动区域的顶部到最后一个子目录贴着滚动区域的底部为止; 当页面在最顶部的时候,当前高亮的子目录肯定是第一个,随着页面的向下滚动,高亮的位置也在不断下移...,如上面的图 ③ 到图 ④ 的变化过程; 如果这个高度差过于大,使得滚动后最后一个子元素不能贴着滚动区域底部的时候,则不按照这个高度差进行滚动,而真实需要滚动的距离是最后一个子目录到滚动区域底部的距离,...很多文章页很长,所以有回到顶部这种功能,试想一下,如果当前页面已经滚动到最底部,这个时候来一下回到顶部,那刚刚写的优化代码会遍历几次?答案是:遍历次数将会是目录子项的总数。...,如上图 ②; 滚动后的高亮目录处于中位线以下且最后一个子目录需要贴着滚动区域底部,此时目录的滚动距离将是滚动列表底部到滚动区域底部的高度差,如上图 ③。

    2.4K20

    MultiWaveHeader

    它允许开发者定制水波的波形、颜色、速度、方向等多个参数,提供了灵活的配置选项,适合用于各种需要视觉反馈的场景,比如加载动画、刷新控件等。 功能特点 调节进度:可以动态调整水波的进度。...高度定制波形 MultiWaveHeader 还支持高度定制每一个水波的参数,像是水波的水平和垂直偏移、拉伸比例以及速度等。...波形方向控制: 顶部方向水波:水波从顶部向下移动,表现为从顶部开始逐渐扩散。 底部方向水波:水波从底部向上移动,表现为从底部开始逐渐扩散。...例如: 顶部 vs 底部波形方向:你可以在顶部或底部创建水波,向上或向下展开,来适应不同的界面设计需求。 一对 vs 单一波形:一对波形效果适合对称美感,而单一波形则给人一种简洁的动态感。...如果你想要在应用中加入动态的水波纹效果,并希望拥有高度的自定义功能,MultiWaveHeader 是一个不容错过的工具。

    3000

    ❤️创意网页:创建更炫酷的动态网页——彩色数字(1到9)粒子动画

    这个动画将在浏览器中展示一组随机位置和颜色的彩色数字粒子,它们将以不同的速度从画布顶部飘落至底部,并循环重新开始,形成一个华丽的视觉效果。...digit; // 数字 } // 更新粒子的位置 update() { this.y += this.velocityY; // 当粒子到达画布底部时...,重新放置到画布顶部 if (this.y > canvas.height) { this.y = 0; } } // 绘制粒子...设置Canvas的宽度和高度为浏览器窗口的宽度和高度,以使画布充满整个窗口。 创建一个Particle类来表示每个粒子。每个粒子具有随机的大小、颜色和竖直速度,以及一个表示1到9之间随机整数的数字。...我们使用requestAnimationFrame来实现连续的动画效果。 最后,调用animate函数启动动画。 完整代码 <!

    32510

    微信小程序实践:2.3 可滚动的容器组件之 scroll-view

    关于这个组件,有以下几个问题值得思考: 1,当我们说滚动时,涉及到外面的滚动容器与里面的可滚动实体两个对象,我们说滚动到顶部、滚动到底部,指的是什么呢?是什么到顶部,什么到底部了?...我们一般说「滚动到顶部、滚动到底部」,指的还不是内部滚动实体滚动到了它所能达到的最大值、最小值,而是指滚动实体顶部边缘到达了滚动外框的顶部,及底滚动实体底部边缘到达了滚动外框的底部。...在vue、小程序中到处都是这样的响应式控制机制,不是直接去调用页面上组件的方法,而只是给组件属性设置一个值,然后静静地等待组件自己更新。...拿到windowHeight之后,它还不是scroll-view应有的高度,因为页面上还可能有自定义的底部导航栏、顶部导航栏,这些高度也要减去。...从基础库2.4开始,已经开始支持嵌套textarea、map、canvas、video这些原生组件了。其它原生组件不支持。支持的越多功能越完备,学习越复杂,性能流失也越大。

    15.3K30

    关于虚拟列表,看这一篇就够了

    列表项高度固定的话,就无需每次都计算当前应该渲染多少条数据,视口的数据量始终是固定的,只需要通过用户滚动的距离,来计算列表的开始结束索引即可。...核心步骤 1.根据容器的高度,计算出所需要渲染的列表项数,以及初始化列表高度 计算条数时,注意要使用Math.ceil(),而不是floor()   // 可视区域最多显示的条数   const limit...estimatedItemHeight,         top: i * estimatedItemHeight,         bottom: (i + 1) * estimatedItemHeight, // 元素底部和容器顶部的距离...= 上一个节点与底部的距离 + 当前节点的高度           positList[nodeID].bottom = nodeID > 0 ?...,所以上方的元素高度与顶部和底部的距离等都是被缓存的       const currentStartIndex = getStartIndex(scrollTop);       // console.log

    4K32

    手把手教你打造RecyclerView滚动特效

    item动画 实现思路 看到这个动画效果时,我首先想到的是,这个动画是可控的,不是通过设置anim.setDuration来实现的,所以要放弃Animation的念头,转而用传入process(动画执行的进度...100% 通过右侧小滑块底部与Item顶部之间的距离占两个Item高度的百分比作为process的值: ?...得到了上一步滑动与process的关系,接下来我们来计算一下滑块底部到RecyclerView可见范围顶部的距离。...(包含不可见部分)与RecyclerView可见部分的高度相差得到;而scrollY则随着RecyclerView的滚动变化,因此需要对RecyclerView进行滚动事件的监听: recyclerView.addOnScrollListener...当RecyclerView滑动太快时,单位滚动距离内,滚动监听事件的触发频率较低,导致有些Item的动画进度未达到100%便从屏幕中消失,从而存在重新滚动到那个Item时,Item的动画停留在1%~99%

    2.7K10

    Android魔术系列:一步步实现淹没、展开效果

    动画分析 这个效果一共有三个状态: (状态1) (状态2) (状态3) 整个效果包含两个阶段: 淹没 —— 从状态1到状态2。整个粉红色的区域向上淹没整个页面 展开 —— 从状态2到状态3。...spread_view —— 这个是黑色区域的部分,一开始高度是0 两个textview —— 中间的圆形button实际上由上下两个独立的部分组成的,而且这两部分中间夹着spread_view(这么布局是为了第二阶段的动画...,下面会详细讲解) 这里要注意,我们使用了textview而不是imageview来实现button的布局,是因为如果使用imageview,当第二阶段展开到button的两部分超出屏幕顶部和底部时,imageview...区域压缩导致图片会被缩小而不是溢出,差别如下 使用ImageView的效果 使用TextView的效果 所以我们这里使用TextView。...总结 再回到floodAnimation,我们看到有一个监听器,当动画结束的时候开始了另外一个动画。

    60920

    Web浏览器滚动方案一览| rAF等

    通过使用window对象的innerWidth和innerHeight属性,我们可以获取窗口的宽度和高度。...这些不一致来源于远古时代,而不是“聪明”的逻辑。获取当前滚动获取文档或DOM元素当前滚动状态是前端开发中很常见的需求。...它有一个参数alignToTop:如果 top=true(默认值),页面滚动,使 elem 出现在窗口顶部。元素的上边缘将与窗口顶部对齐。...如果 top=false,页面滚动,使 elem 出现在窗口底部。元素的底部边缘将与窗口底部对齐。亦或是接受一个包含以下属性的对象:behavior:定义滚动是立即的还是平滑的动画。...block:定义垂直方向的对齐方式,可以取值为 start(顶部对齐)、center(居中对齐)、end(底部对齐)或 nearest(最近对齐)。默认为 start。

    16710

    数据工厂平台11:首页收尾

    而不是说你吃了苦就一定能成为人上人,所以选对方法,选对路线很重要,基础技术也很重要。 所以我们先对这个扇形图进行大小和位置的调整。...修改的方法之前章节已经讲过,这里不再赘述,基本就是找到这些控件的原始的前端宽度 高度等,然后去对应的js文件中修改: 这里给大家直接说修改的各处结果吧: 外圈大小:home_tj.html顶部的 css...所以我们干脆把顶部标题:欢迎访问首页 给干掉,这样就可以余留出大片高度了。这个标题放在这很难看,早晚都要移动走的。...2.检查页面有无可以直接操控的js函数 页面底部发现一个js函数,但是经过我简单阅读,发现这只是文案的变化函数,也就是你写个15% ,它的动画效果会从0%一直飞速增长到15%,对指针图像角度来说 并无影响...斗大的汗珠开始从博主额头滚下~ 3.检查顶部css,找到影响指针图像角度的代码部分 经过排查,发现顶部针对这四个图都有具体的样式设计,而且每个扇形图都分为外圈和内指针俩个角度影响的部分,外圈图像分别指向

    76420

    H5游戏开发指南

    现在已经有很多2K分辨率的手机屏幕了,设计稿是不是也要把宽高跟着最大分辨率来设计。显然不是。先看一下市面上主流的手机尺寸: ?...在底部或者顶部多多少少会有一个状态栏的占位,并不能展示手机的全部尺寸。一些手机浏览器底部会有导航,也有些会在顶部和底部都有占位,比如导航栏、状态栏。顶部的占位会把内容往下挤,底部的占位会把内容遮盖住。...除去顶部大概130px的像素,底部大概150左右的像素,内容的安全高度大概有850左右,怎么布局页面,具体要看你的项目主要在什么环境上运行。...在做动画时,我们只需要在动画的开头和结尾设定好状态,在中间只需要做一些过渡,就能实现图画的运动;插入中间的过渡是由计算机自动运算而得到的。这种动画叫做补间动画。...不同于补间动画,逐帧动画的每一帧都需要单独制定,而不像补间动画那样只需要制定开始和结束的那两个关键帧,同时逐帧动画是通过图片来实现的,我们可以给它的每一帧都指定一张图片,然后这些帧连续起来播放,就形成了一个动画

    4.4K112

    Bootstrap源码分析之transition、affix

    实现根据浏览器支持transition的能力,然后绑定动画的结束事件; 首先:创建一个Element; 然后:迭代查看此元素支持的transition动画名称 Transition实现的技巧,主要是重写了...3.2、Affix:在页面中部的时候会添加的样式 3.3、Affix-bottom:在页面底部的时候会添加的样式 4、处理公式: 1、Top:traget的滚动条高度(scrollTop)高度 >= 整个文档滚动条高度 – 粘住元素距离底部的高度    3.1、如果是非首次bottom定位       3.1.1、如果offsetTop(元素设定离顶位置的距离)不为空...> 文档高度 – 粘住元素距离底部的高度 4、能改变粘住元素的只有他的top,top值为:文档高度 — 粘住元素高度 — 粘住元素距离底部的高度 5、坑之所在: 1、top和bottom一起使用的时候...,会出现冲突,原因:     Affix-bottom,也就是到达页面底部的时候,bootstrap是用offset来设置的top值,给元素加了position:relative值,这就导致在回到页面顶部后

    1.5K70
    领券