Java 中算术级数中的缺失数字

2024 年 9 月 26 日 | 阅读 7 分钟

这是一个非常有趣的问题,经常出现在 Google、Amazon、TCS、Accenture 等顶级 IT 公司的面试中。通过解决这个问题,面试官希望考察面试者的逻辑能力、批判性思维和解决问题的能力。因此,在本节中,我们将使用不同的方法和逻辑来在 Java 中找到等差数列中的缺失数字。此外,我们还将为此创建 Java 程序。

问题陈述

给定一个数组。该数组包含一些表示等差数列的数字。在等差数列中,缺少一个数字。任务是找到这个缺失的数字。

示例 1

输入

int arr[] = {3, 5, 7, 9, 11, 15, 17, 19}

输出 13

解释:如果我们在输入数组中数字 11 之后插入数字 13,则等差数列就完整了。因此,答案是 13

示例 2

输入

int arr[] = {1, 7, 13, 19, 31, 37, 43}

输出 25

解释:如果我们在输入数组中数字 19 之后插入数字 25,则等差数列就完整了。因此,答案是 25。

示例 3

输入

int arr[] = {25, 18, 4, -3, -10, -17, -24}

输出 11

解释:如果我们在输入数组中数字 18 之后插入数字 11,则等差数列就完整了。因此,答案是 11。

问题解决方案

使用等差数列公式

一个等差数列的数字之和,其首项为 a1,末项为 an,

总项数为 n 时:Sn = (n x (a1 + an) ) / 2。因此,我们可以计算输入数组的和。这是因为我们知道输入数组的首项、末项和大小。如果我们参考示例 1,我们得到

S9 = (9 x (3 + 19)) / 2 = (9 x 22) / 2 = 198 / 2 = 99 (9 是包含缺失元素的输入数组的大小)

现在,遍历数组并找到现有元素的和。我们得到

元素之和:3 + 5 + 7 + 9 + 11 + 15 + 17 + 19 = 86

现在,用 S8 减去输入数组元素的和。我们得到 99 - 86 = 13,这是等差数列的缺失元素。以下程序实现了相同的概念。

文件名:MissingElementAP.java

输出

For the input array: 
3 5 7 9 11 15 17 19 
The missing element is: 13


For the input array: 
1 7 13 19 31 37 43 
The missing element is: 25


For the input array: 
25 18 4 -3 -10 -17 -24 
The missing element is: 11

复杂度分析:由于程序使用二分查找,因此程序的时间复杂度为 O(n),其中 n 是输入数组中存在的元素总数。程序不使用任何辅助空间。因此,程序的空间复杂度是常数,即 O(1)。