Java 中查找最接近目标的神秘函数的值13 May 2025 | 5 分钟阅读 给定一个整数数组 (arr) 和一个整数 target,我们需要找到通过对 arr 的非空子数组执行按位 AND 操作可以获得的、最接近 target 的值。任务是返回计算出的 AND 值与 target 之间的最小绝对差。 示例 1 输入 arr = {9, 12, 3, 7, 15} target = 5 输出:最接近的值:2 解释:可能的 AND 值:{9, 8, 0, 0, 0}。最接近 5 的值是 2(来自 abs(0 - 5) = 2)。 示例 2 输入 arr = {8, 6, 2} target = 4 输出:最接近的值:2 解释:计算出的 AND 值为 {8, 0, 0},最接近 4 的值是 2,来自 abs(2 - 4) = 2。 方法 1:暴力枚举法该方法遍历给定数组的所有可能子数组并计算它们的按位 AND 值。然后通过计算绝对差值找到最接近给定目标的那个值。 算法步骤 1:将 closest 初始化为 Integer.MAX_VALUE。 步骤 2:遍历数组中的每个索引 i 步骤 2.1:以 arr[i] 作为初始 AND 值。 步骤 2.2:遍历所有后续索引 j 步骤 2.2.1:计算从 i 到 j 的子数组的按位 AND。 步骤 2.2.2:如果与目标的绝对差值更小,则更新 closest。 步骤 2.2.3:如果 AND 值小于或等于 target,则提前停止,因为进一步的 AND 操作不会增加它。 步骤 3:返回找到的最接近值。 让我们在 Java 程序中实现上述步骤。 输出 Closest Value: 2 复杂度时间复杂度:程序的 O(n^2),其中 n 是数组的大小。这是因为我们为每个子数组计算 AND 操作。 空间复杂度:程序的 O(1)。因为我们只使用几个整数变量。 方法 2:使用 Set该方法通过对非空子数组执行按位 AND 操作来搜索最接近目标的值。而不是遍历所有可能的子数组(这效率低下),我们使用一个 Set 来在每一步维护唯一的 AND 值。 算法步骤 1:初始化一个空的 Set 来存储前几次迭代的可能 AND 结果。 步骤 2:遍历数组 步骤 2.1:创建一个新的 Set(newSet),其中存储 步骤 2.1.1:当前元素。 步骤 2.1.2:当前元素与 andSet 中每个值的 AND 结果。 步骤 2.2:将 newSet 更新为 andSet,用于下一次迭代。 步骤 2.3:计算与目标的绝对差值,并更新最接近的结果。 步骤 3:返回找到的最接近值。 输出 Closest Value: 2 复杂度时间复杂度:程序的 O(n log m)。这是因为每个元素最多会与 log M 个不同的值进行 AND 操作,其中 M 是可能的 AND 结果的最大值。 空间复杂度:程序的 O(log m)。因为 Set 每轮最多存储 log M 个不同的值。 方法 3:动态规划该方法通过维护跨子数组的按位 AND 值的动态列表来查找最接近给定目标的值。 算法步骤 1:维护一个列表 (andList) 来存储前一个元素的活动 AND 值。 步骤 2:对于数组中的每个元素 步骤 2.1:创建一个新列表 (newList),其中第一个元素是当前数字。 步骤 2.2:计算 num 与前一个 AND 结果之间的 AND 操作。 步骤 2.3:只存储唯一的 AND 值以避免冗余。 步骤 2.4:通过检查与目标的绝对差值来更新 closest。 步骤 3:该过程会持续到所有元素都被处理,从而确保有效地搜索最接近的值。 输出 Closest Value: 2 复杂度时间复杂度:程序的 O(n log m)。这是因为每个元素都被处理一次,并且一个数字最多存在 log M 个唯一的 AND 值。 空间复杂度:程序的 O(log m)。因为 andList 的大小最多保持为 log M,其中 M 是可能的 AND 结果的最大值。 |
是当今世界上最流行的编程语言之一,广泛应用于从 Web 开发到移动应用程序开发的各种应用。Java 由 James Gosling 及其团队于 1990 年在 Sun Microsystems 开发。它因其简洁、易于……
阅读 4 分钟
Java 中的计数器变量是一种特殊的变量,用于循环计数重复次数或知道我们处于哪次重复。简单来说,计数器变量是跟踪...的变量。
阅读 4 分钟
在 Java 中不使用循环打印数字通常涉及替代技术,例如递归或流处理。在本节中,我们将讨论在 Java 中不使用传统循环打印数字 1 到 100 的方法。递归和 Java Stream 都提供了替代……
5 分钟阅读
Java 中的 return 语句是什么?在 Java 编程中,当代码块执行完成后,return 语句用于返回一个值。循环内的 return 语句将导致循环中断,并且后面的语句将被忽略...
7 分钟阅读
异或(XOR)运算,也称为逻辑异或运算,是一种编程中常用的逻辑运算。当且仅当只有一个操作数为真时,它返回真。在 Java 中,XOR 运算可以应用于集合,使我们能够执行...
阅读 4 分钟
在本节中,我们将学习什么是均衡数字,并创建 Java 程序来查找均衡数字。它经常出现在 Java 编码面试和学术讨论中。均衡数字:一个自然数,其数字个数与其中存在的数字个数相同...
阅读 4 分钟
java.text.CollationElementIterator 有一个 secondaryOrder() 方法。CollationElementIterator 对象中的每个 Collation 元素都有一个 secondary 组件,由 CollationElementIterator 类提供。语法:public static final short secondaryOrder(int order) 参数:上述方法需要查找次要组件以用于排序元素...
阅读 4 分钟
是访问修饰符。它可以分配给变量、方法和内部类。它是限制性最强的访问修饰符。需要记住的点:私有访问修饰符只能在同一个类中访问。我们不能将 private 分配给外部类和接口。...
阅读 3 分钟
在面向对象编程中,类是创建对象的蓝图或模板。从类创建的每个对象都有自己的一组属性(数据)和方法(函数)来定义其行为。在某些情况下,我们可能只希望一个类的实例...
阅读 4 分钟
Java 是世界上最流行的编程语言之一,并且被用于从移动应用程序到企业系统的各种用途。学习 Java 的重要部分是理解数据类型,它告诉程序变量可以保存什么类型的值……
阅读 8 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India