查找数组中发生奇数次数的数字

时间: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