面试官:聊一聊数组下标与长度之间的计算!
共 2835字,需浏览 6分钟
·
2023-10-31 22:25
你知道的越多,不知道的就越多,业余的像一棵小草!
你来,我们一起精进!你不来,我和你的竞争对手一起精进!
编辑:业余草
来源:juejin.cn/post/7278584104852455463
推荐:https://t.zsxq.com/13cxMMseT
自律才能自由
在计算机科学中,数组是一种常用的数据结构,它允许我们在内存中存储一系列的元素,并通过下标来访问它们。对于一个数组,我们可以用下标来表示每个元素的位置,同时也可以通过下标计算出数组的长度。在解决算法题的时候,经常会遇到知道两个下标,求长度,或者知道一个下标和长度,需要求出另一个数的下标的情况,而且有时候需要+1,有时候需要-1,往往分不清楚。要理清什么时候该+1,什么时候该-1,是有逻辑和规律的。下面就说明这两者之间的换算关系。
让我们以以下示例数组为例:
元素: 2, 5, 3, 9, 1, 7, 4, 6, 0
下标: 0 1 2 3 4 5 6 7, 8
其中,下标表示的是在这个元素前面有几个元素。
数组下标为什么从0开始?
这个问题可能很多人都没有思考过,但这还真的有大牛解答过这个问题。关于这个问题的文章解释在这里:为什么数组下标从 0 开始?而不是 1?https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html
。
从文章中的解释中可以看到,一个数组实际上是一个连续的整数序列,而用一个不等式来表示这个序列,有很多种方式,但最优雅的表示方式是用一个左闭右开的区间来表示。因为「不等式边界的差(不等式右边 - 不等式左边)正好等于连续序列的长度」
这个结论很重要。比如,以上述数组为例,要表示这个数组,其下标区间可以用 [0, 9)
来表示,而 9 - 0 = 9 ,恰好是整个数组的长度。由此可以引申出一个结论,对于在数组中给出任意的左闭右开的区间,都可以无脑地通过简单的减法来得到这个区间的长度。
比如,给出区间是 [3,7)
,那么其长度就是 7 - 3 = 4,区间长度就是4,无需怀疑,不用+1,也不用-1,就是这么直接。
知道这个结论又有什么用呢?我们可以通过这个结论,推导出不同的区间中,什么时候要+1,什么时候要-1。
数组下标与长度的计算关系
知道起始下标和终止下标求长度
由上结论可知,通过一个左闭右开的区间可以直接计算出其长度。用形式化一点的语言表示,也就是:
❝要计算区间
❞[start, end)
的长度,其中start
和end
分别表示区间的起始下标和结束下标。那么这个区间的长度就等于end - start
。具体来说,end
表示的是右侧第一个没有计入区间的元素的下标,而start
表示的是左侧第一个计入区间的元素的下标。因此,我们只需要将end
减去start
,就可以得到区间长度
那我们来推导其他区间的表现形式会是怎么样的。
区间 | 示例 |
---|---|
[start, end) | end - start,[4,6) => 6 - 4 = 2, 即[4,5],以这个为蓝本推导其他的区间长度的计算 |
[start, end] | end - start + 1,[4,6] => 6 - 4 + 1 = 3,即[4,5,6] |
(start, end) | end - start - 1,(4,6) => 6 - 4 - 1 = 1, 即[5] |
(start, end] | end - start,(4,6] => 6 - 4 = 2, 即[5,6] |
我们可以看到,需要+1或-1的区间总比我们的标准的左闭右开区间要多一个元素或少一个元素。所以,我们可以拿实际遇到的区间和左闭右开的区间做比较,看看是多了元素还是少了元素,就知道要+1还是-1了。
知道起始下标和长度求终止下标
如果我们已知数组中某个元素的起始下标以及与之相邻的区间长度,如何计算这个区间的终止下标呢?假设我们要计算起始下标为 start
、长度为 len
的区间的终止下标 end
。这时,根据上面的定义,我们应该有 end = start + len
。
以 start = 4, len = 3, 求 end 为例:
区间 | 示例 |
---|---|
[end, start) | end = start - len,4 - 3 = 1 => [1, 4),和上述长度的定义是一致的 |
[start, end) | end = start + len,4 + 3 = 7 => [4, 7),和上述长度的定义是一致的 |
(end, start] | end = start - len, 4 - 3 = 1 => (1, 4],和上述长度的定义是一致的 |
当我们下标为start时,可以通过套用上述的结论,得到对应的区间范围是什么。也就是说,只要区间符合一开一闭,那么区间的起始下标和终止下标相减即为长度。如果不是一开一闭,那么就要视区间的开闭而决定是+1还是-1了。
总结
数组的下标和长度是一对重要的概念,它们之间有很紧密的联系。如果我们能够清楚地理解它们之间的计算关系,就能更加高效地解决算法题中各种下标的情况了。