Java 中查找数字的奇数出现次数2024年9月10日 | 阅读 9 分钟 给定一个非负整数数组,其中每个数字都出现偶数次,只有一个数字出现奇数次。任务是找到出现奇数次的那个数字。 示例 输入: a[] = {7, 4, 5, 4, 5, 7, 5, 9, 8, 9, 6, 8, 6} 输出 5 解释: 除了 5 之外,所有其他数字都出现了偶数次。注意数字 5 在输入数组中出现了 3 次,这是奇数。 输入: a[] = {4, 3, 9, 3, 4, 9, 4, 7, 4, 7, 4} 输出 4 解释: 除了 4 之外,所有其他数字都出现了偶数次。注意数字 4 在输入数组中出现了 5 次,这是奇数。 朴素方法最直接的解决方案是使用两个循环。外层循环选择一个数字,内层循环计算该数字出现的频率。如果出现频率是偶数,则我们丢弃该数字。如果出现频率是奇数,则我们返回该数字。 文件名: OddOccurrence.java 输出 In the following input array: 7 4 5 4 5 7 5 9 8 9 6 8 6 The number whose occurrence is odd is: 5 In the following input array: 4 3 9 3 4 9 4 7 4 7 4 The number whose occurrence is odd is: 4 时间复杂度: 上述程序使用了两个嵌套的循环。因此,时间复杂度为 O(n2),其中 n 是输入数组中的总元素数。 空间复杂度: 上述程序不使用任何额外空间。因此,上述程序的空间复杂度为 O(1)。 使用数组查找出现奇数次的数字我们可以使用一个数组来存储元素的出现频率。然后,我们可以检查出现频率为奇数的数字。以下程序演示了这一点。 文件名: OddOccurrence1.java 输出 In the following input array: 7 4 5 4 5 7 5 9 8 9 6 8 6 The number whose occurrence is odd is: 5 In the following input array: 4 3 9 3 4 9 4 7 4 7 4 The number whose occurrence is odd is: 4 时间复杂度: 上述程序使用了三个循环。但是,这些循环不是嵌套的。因此,时间复杂度为 O(n),其中 n 是输入数组中的总元素数。 空间复杂度: 上述程序使用了一些额外空间。我们看到程序中使用了数组来存储元素的出现频率。上述程序的空间复杂度为 O(maxElement),其中 maxElement 是输入数组中的最大元素。 此方法的缺点是用于存储频率的数组中存在未使用的空间。例如:对于数组 {7, 4, 5, 4, 5, 7, 5, 9, 8, 9, 6, 8, 6},内存将被分配给数组 storeFreq[] 中的 10 个元素。但是,只有 storeFreq[4]、storeFreq[5]、storeFreq[6]、storeFreq[7]、storeFreq[8] 和 storeFreq[9] 会被使用。因此,为 storeFreq[0]、storeFreq[1]、storeFreq[3] 以及更多元素分配的内存将白白浪费。如果输入是 {1000, 1, 1000},情况会更糟。在这种情况下,我们必须为 1001 个元素分配内存,而其中只有 2 个元素(一个用于 1000,另一个用于 1)的内存将被使用。其余的内存分配都是无用的。为了避免这种内存浪费,我们应该使用哈希表。 使用哈希表查找出现奇数次的数字我们也可以使用哈希表来存储元素的出现频率。之后,我们可以检查出现频率为奇数的数字。以下程序对此进行了说明。 文件名: OddOccurrence2.java 输出 In the following input array: 7 4 5 4 5 7 5 9 8 9 6 8 6 The number whose occurrence is odd is: 5 In the following input array: 4 3 9 3 4 9 4 7 4 7 4 The number whose occurrence is odd is: 4 时间复杂度: 上述程序使用了两个循环。但是,这些循环不是嵌套的。因此,时间复杂度为 O(n),其中 n 是输入数组中的总元素数。 空间复杂度: 上述程序使用了一些额外空间。请注意程序中使用了哈希表来存储元素及其出现频率。显然,哈希表不能存储比输入数组中存在的元素更多的元素。因此,上述程序的空间复杂度为 O(n),其中 n 是输入数组中的总元素数。 使用按位异或运算符查找出现奇数次的数字在此方法中,我们将使用按位异或 (^) 运算来查找输入数组中数字的奇数次出现。此方法背后的思想是异或运算是可交换的,即: 我们所做的只是重新排列数字,使相同的数字分组在一起。而且,我们知道任何两个相同数字的异或运算结果为 0。因此: 7 ^ 7 = 0, 4 ^ 4 = 0, 5 ^ 5 ^ 5 = 0 ^ 5 = 5, 9 ^ 9 = 0, 8 ^ 8 = 0, 6 ^ 6 = 0 因此,我们得到: 7 ^ 7 ^ 4 ^ 4 ^ 5 ^ 5 ^ 5 ^ 9 ^ 9 ^ 8 ^ 8 ^ 6 ^ 6 = 0 ^ 0 ^ 5 ^ 0 ^ 0 ^ 0 = 5 以下程序显示了这一点。 文件名: OddOccurrence3.java 输出 In the following input array: 7 4 5 4 5 7 5 9 8 9 6 8 6 The number whose occurrence is odd is: 5 In the following input array: 4 3 9 3 4 9 4 7 4 7 4 The number whose occurrence is odd is: 4 时间复杂度: 上述程序仅使用一个循环。因此,时间复杂度为 O(n),其中 n 是输入数组中的总元素数。 空间复杂度: 上述程序不使用任何额外空间。因此,上述程序的空间复杂度为 O(1)。 下一主题Java 缩进 |
在 Reactor 和 Spring 生态系统的上下文中,Mono 是响应式编程的基本构建块。它表示零个或一个元素的流,并且是 Project Reactor 的一部分,它为构建 Java 虚拟机上的响应式应用程序提供了基础……
阅读 3 分钟
Java 是最受欢迎的编程语言之一。Java 以其无需修改 Java 应用程序即可在多个操作系统上运行的特点而闻名。本文将帮助用户在 macOS 中验证其 Java 版本,了解其重要性,使用多个版本,...
阅读 4 分钟
为什么非静态变量不能从静态上下文中引用? 在 Java 中,非静态变量无法从静态上下文中引用的错误通常是初学者在编译 Java 程序时遇到的。此错误发生的原因是...
5 分钟阅读
在 Java 中,Fork/Join 框架主要用于提供与并行处理和编程相关的功能,它通过将操作分解为更小的操作或指令来完成,然后利用可用核心进行处理...
阅读9分钟
>> << Java assert 关键字用于测试程序的假设。在执行断言时,假定其为真。如果失败,JVM 将抛出名为 AssertionError 的错误。它主要用于测试目的。断言的优势它提供了一种有效的检测...
阅读1分钟
在Java中,异常是程序执行期间发生的事件,会中断程序指令的正常流程。我们不想要且会阻碍程序正常执行代码的错误或缺陷被称为...
阅读 10 分钟
给定一个十六进制数 N,将其转换为相应的二进制编码的十进制数是任务。示例 1:输入:String str = "2A3" 输出:等效的 BCD 是 0010 1010 0011 说明:2 的二进制:0010 A 的二进制:1010 3 的二进制:0011 因此,等效的 BCD 是 0010 1010 0011。示例……
阅读 6 分钟
C++ 支持作用域解析运算符(::),它允许我们解析标识符的歧义调用或引用。与 C++ 不同,Java 不支持作用域解析运算符。Java 使用相同的运算符(::)但名称不同。Java 中的作用域解析运算符...
阅读 3 分钟
二进制数在计算机科学中起着至关重要的作用。它仅使用数字 0 和 1 来显示信息。确定一个二进制数是否可被 3 整除需要理解模运算、数字和乘法。可以分析二进制数以...
5 分钟阅读
在本节中,我们将学习什么是贝尔数,并创建 Java 程序来检查给定的数字是否为贝尔数。贝尔数程序经常在 Java 编码面试和学术界中出现。贝尔数 贝尔数是一系列...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India