Java 中的锯齿形数组2025 年 5 月 13 日 | 阅读 6 分钟 在本节中,我们将通过适当的示例讨论什么是锯齿数组。此外,我们将创建一个Java 程序将简单或普通数组转换为锯齿数组,反之亦然。 什么是锯齿数组?当数组中没有三个连续的元素呈递增或递减顺序时,该数组称为锯齿数组。换句话说,我们可以说如果数组中有三个元素(例如 ai, ai+1, ai+2),使得 ai < ai+1 < ai+2 或 ai > ai+1 > ai+2,则该数组不是锯齿数组。 因此,我们可以象征性地表示条件如下 其中 a、b、c、d、e 和 f 是数组的元素。 总之,我们可以说数组元素必须交替遵循小于 (<) 和大于 (>) 的顺序。每个元素要么大于或小于其相邻元素。 锯齿数组示例数组 A = [4, 2, 6, 3, 10, 1] 和 B = [8, 4, 6, 3, 5, 1, 10, 9] 是锯齿数组。因为数组中没有三个连续的元素呈递增或递减顺序。 数组 C = [5, 2, 3, 6, 1] 不是锯齿数组,因为元素 a1 < a2 < a3,即 (2 < 3 < 6)。如果我们删除第三个元素,即 6,则数组变为 [5, 2, 3, 1],这是一个锯齿数组。其他锯齿数组是 ![]() 以下数组不是锯齿数组,因为(以红色显示的)元素不遵循顺序。 ![]() 可以使用以下两种方法 方法 1:简单解决方案
对于上述方法,复杂度为 O(n log n),空间复杂度为 O(1),因为不需要额外的空间。 方法 2:高效解决方案第二种方法通过在一遍中执行冒泡排序来提供有效的解决方案。它在 O(n) 时间内将数组转换为锯齿状。 为了执行冒泡排序,我们需要维护一个标志来表示顺序(小于 (<) 或大于 (>))。如果两个元素不符合该顺序,则交换这两个元素,否则不交换。 算法
让我们看一个示例。 考虑一个具有三个元素的数组 A = [5, 3, 1]。这里,5 > 3 > 1。这意味着它不是锯齿数组。假设我们正在处理 3 和 1,即 3 > 1。所以,如果我们交换 3 和 1,则关系变为 5 > 1,1 < 3,最终我们得到锯齿数组,即 [5, 1, 3]。 将普通数组转换为锯齿数组考虑下面的数组并将其转换为锯齿数组。 ![]() 最初,变量 flag 设置为 false。在以下步骤中,a[i] 是当前元素,a[i+1] 是下一个元素。 步骤 1:保持第一个元素不变,因为第一个元素没有左邻居,我们无法将其与前一个元素进行比较。 这里,flag = false 且 a[i] 即 3 小于 a[i+1] 即 4。所以,我们不交换元素。将 i 增加 1 并将 flag 变量设置为 true。 ![]() 步骤 2:这里,flag = true 且 a[i] 即 4 小于 a[i+1] 即 6。条件 i>i+1 为 false。所以,我们将交换元素 (a[i], a[i+1])。将 i 增加 1 并将 flag 设置为 false。 ![]() 步骤 3:这里,flag = false 且 a[i] 即 4 大于 a[i+1] 即 2。条件 i<i+1 为 false。所以,我们将交换元素 (a[i], a[i+1])。将 i 增加 1 并将 flag 设置为 true。 ![]() 步骤 4:这里,flag = true 且 a[i] 即 4 大于 a[i+1] 即 1。条件 i<i+1 为 false。所以,我们不交换元素 (a[i], a[i+1])。将 i 增加 1 并将 flag 设置为 false。 ![]() 步骤 5:这里,flag = false 且 a[i] 即 1 小于 a[i+1] 即 6。条件 i<i+1 满足。所以,我们不交换元素 (a[i], a[i+1])。将 i 增加 1 并将 flag 设置为 true。 ![]() 步骤 6:这里,flag = true 且 a[i] 即 8 小于 a[i+1] 即 9。条件 i>i+1 为 false。所以,我们将交换元素 (a[i], a[i+1])。将 flag 设置为 false。 ![]() 在上面的例子中,我们观察到 flag 交替变为 true 和 false。 让我们检查该数组是否为锯齿数组。 ![]() 上述数组是锯齿数组,因为小于和大于操作是交替放置的。 让我们在 Java 程序中实现上述算法。 ZigzagArrayExample.java 输出 [2, 5, 1, 7, 4, 8, 6] 让我们看另一个例子。 ZigzagArrayExample.java 输出 ![]() 为了将数组转换为锯齿状,我们还可以使用以下逻辑 上述逻辑也运行良好。 |
在 Java 中,Callable 接口在 Java 5 中被引入,作为现有 Runnable 接口的替代方案。它封装了一个任务,并将其传递给 Thread 或线程池进行异步执行。Callable 代表一个异步计算,其值可通过 Future 获得……
阅读 4 分钟
在本节中,我们将讨论什么是全数数字及其版本,并创建 Java 程序来检查给定的数字是否为全数数字。全数数字程序经常在 Java 编码面试和学术界中被问到。全数数字:一个 10 位整数...
阅读 4 分钟
FloatBuffer put() 主要有两种方法,它们接受不同的参数。put(float f) put(int index, float f) i. put(float f) java.nio.FloatBuffer 类具有 put(float f) 函数。新生成的浮点缓冲区以指定浮点数写入当前位置,然后位置会递增...
5 分钟阅读
Java 以其健壮且通用的特性,提供了多种方法将文件从一个位置复制到另一个位置。无论您是处理本地文件系统还是远程服务器,Java 丰富的 API 都使文件操作成为一项简单的任务。在本综合指南中,我们将探讨各种技术...
5 分钟阅读
在给定的整数数组 arr[](大小为 n)中,找到仅由素数组成的连续子数组的最大和。换句话说,不允许在选定的子数组中存在非素数。示例 1:输入:int a[] = {...
7 分钟阅读
类文件是 .java 文件的编译形式。当我们编译 Java 源代码(.java 文件)时,它会生成一个 .class 文件。如果一个 Java 程序有多个类,在这种情况下,编译源文件后,我们将得到相同的...
阅读 3 分钟
ASCII 代表美国信息交换标准代码。ASCII 是一种标准数据传输代码,计算机用于表示文本数据和控制字符。ASCII 是一种 7 位字符集,包含 128 个字符,即从 0 到 127。ASCII 表示...
阅读 12 分钟
什么是 .NET?Microsoft 的 .NET 框架是一个开源框架,面向 Microsoft 产品用户。该框架最初于 2002 年发布时是专为 Microsoft 设计的。这意味着您无法在 Linux、Android 或 iOS 上编写代码或执行生成的应用程序。它曾经是...
阅读 3 分钟
java.nio.DoubleBuffer 有一个 limit() 函数。DoubleBuffer 类用于调整此 DoubleBuffer 的限制。此方法使用参数设置此缓冲区的新的限制,该参数是要设置的限制。这个新的限制没有被设置,并且...
阅读 3 分钟
Java中的Image类是用于图形图像表示的所有其他类的抽象超类。类声明java.awt.Image类的声明如下:Public abstract class Image extends Object Class Fields下表显示了Image类的各种字段。字段描述protected float accelerationPriority它优先加速...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India