面试官:聊一聊数组下标与长度之间的计算!

业余草

共 2835字,需浏览 6分钟

 · 2023-10-31

你知道的越多,不知道的就越多,业余的像一棵小草!

你来,我们一起精进!你不来,我和你的竞争对手一起精进!

编辑:业余草

来源: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) 的长度,其中 startend 分别表示区间的起始下标和结束下标。那么这个区间的长度就等于 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了。

总结

数组的下标和长度是一对重要的概念,它们之间有很紧密的联系。如果我们能够清楚地理解它们之间的计算关系,就能更加高效地解决算法题中各种下标的情况了。

浏览 380
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报