查找数组中发生奇数次数的数字
时间:2020-02-23 14:34:12 来源:igfitidea点击:
在本教程中,我们将看到如何查找数组中的奇数次数。
问题:
我们被赋予了一系列整数。
除了一个之外,所有数字甚至都会出现。
我们需要查找奇数时间发生的数字。
我们需要用O(n)时间复杂度和O(1)空间复杂度来解决它。
例如:
int array[] = new int[]{20, 40, 50, 40, 50, 20, 30, 30, 50, 20, 40, 40, 20}; Number which occurs odd number of times is : 50
解决方案:
解决方案1:使用两个循环并比较元素:
这是这个问题的蛮力解决方案,但它需要O(n * n)时间复杂度。
解决方案2:使用散列
我们可以使用键和数字并计数为值,并且只要重复键,即可将计数器递增1.
int getOddTimesElementHashing(int ar[]) { int i; HashMap<Integer,Integer> elements=new HashMap<Integer,Integer>(); for (i = 0; i < ar.length; i++) { int element=ar[i]; if(elements.get(element)==null) { elements.put(element, 1); } else elements.put(element, elements.get(element)+1); } for (Entry<Integer,Integer> entry:elements.entrySet()) { if(entry.getValue()%2==1) { return entry.getKey(); } } return -1; }
但上面的解决方案需要空间复杂度的O(n)。
解决方案3:使用XOR操作:
我们可以为所有元素进行按位XOR操作,并将为我们提供奇数次数的元素。
int getOddTimesElement(int ar[]) { int i; int result = 0; for (i = 0; i < ar.length; i++) { result = result ^ ar[i]; } return result; }
上面的算法解决了O(n)时间复杂度和O(1)空间复杂度的问题,这是上述程序的最佳解决方案。
Java程序以查找数组中发生的数量奇数:
package org.igi.theitroad; //Java program to find the element occurring odd number of times public class NumberOddTimesMain { int getOddTimesElement(int ar[]) { int i; int result = 0; for (i = 0; i < ar.length; i++) { //XOR operation result = result ^ ar[i]; } return result; } public static void main(String[] args) { NumberOddTimesMain occur = new NumberOddTimesMain(); int array[] = new int[]{20, 40, 50, 40, 50, 20, 30, 30, 50, 20, 40, 40, 20}; System.out.println("Number which occurs odd number of times is : "+occur.getOddTimesElement(array)); } }
运行上面的程序时,我们将得到以下输出:
Number which occurs odd number of times is : 50