查找出现奇数次的数字

原文: https://www.geeksforgeeks.org/find-the-number-occurring-odd-number-of-times/

给定一个正整数数组。 除一个数字为奇数次外,所有数字均出现偶数次。 在O(n)时间&恒定空间中找到数字。

示例

Input : arr = {1, 2, 3, 2, 3, 1, 3}
Output : 3

Input : arr = {5, 7, 2, 7, 5, 2, 5}
Output : 5

简单解决方案是运行两个嵌套循环。 外循环一一拾取所有元素,内循环计数外循环拾取的元素的出现次数。 该解决方案的时间复杂度为 O(n^2)

以下是暴力方法的实现:

C++

// C++ program to find the element  
// occurring odd number of times 
#include<bits/stdc++.h> 
using namespace std; 

// Function to find the element  
// occurring odd number of times 
int getOddOccurrence(int arr[], int arr_size) 
{ 
    for (int i = 0; i < arr_size; i++) { 

        int count = 0; 

        for (int j = 0; j < arr_size; j++) 
        { 
            if (arr[i] == arr[j]) 
                count++; 
        } 
        if (count % 2 != 0) 
            return arr[i]; 
    } 
    return -1; 
} 

// driver code 
int main() 
    { 
        int arr[] = { 2, 3, 5, 4, 5, 2, 
                      4, 3, 5, 2, 4, 4, 2 }; 
        int n = sizeof(arr) / sizeof(arr[0]); 

        // Function calling 
        cout << getOddOccurrence(arr, n); 

        return 0; 
    } 

Java

// Java program to find the element occurring 
// odd number of times 
class OddOccurrence { 
      
    // function to find the element occurring odd 
    // number of times 
    static int getOddOccurrence(int arr[], int arr_size) 
    { 
        int i; 
        for (i = 0; i < arr_size; i++) { 
            int count = 0; 
            for (int j = 0; j < arr_size; j++) { 
                if (arr[i] == arr[j]) 
                    count++; 
            } 
            if (count % 2 != 0) 
                return arr[i]; 
        } 
        return -1; 
    } 
      
    // driver code  
    public static void main(String[] args) 
    { 
        int arr[] = new int[]{ 2, 3, 5, 4, 5, 2, 4, 3, 5, 2, 4, 4, 2 }; 
        int n = arr.length; 
        System.out.println(getOddOccurrence(arr, n)); 
    } 
} 
// This code has been contributed by Kamal Rawal

Python3

# Python program to find the element occurring 
# odd number of times 
      
# function to find the element occurring odd 
# number of times 
def getOddOccurrence(arr, arr_size): 
      
    for i in range(0,arr_size): 
        count = 0
        for j in range(0, arr_size): 
            if arr[i] == arr[j]: 
                count+=1
              
        if (count % 2 != 0): 
            return arr[i] 
          
    return -1
      
      
# driver code  
arr = [2, 3, 5, 4, 5, 2, 4, 3, 5, 2, 4, 4, 2 ] 
n = len(arr) 
print(getOddOccurrence(arr, n)) 
  
# This code has been contributed by  
# Smitha Dinesh Semwal

C

// C# program to find the element  
// occurring odd number of times 
using System; 
  
class GFG 
{ 
    // Function to find the element  
    // occurring odd number of times 
    static int getOddOccurrence(int []arr, int arr_size) 
    { 
        for (int i = 0; i < arr_size; i++) { 
            int count = 0; 
              
            for (int j = 0; j < arr_size; j++) { 
                if (arr[i] == arr[j]) 
                    count++; 
            } 
            if (count % 2 != 0) 
                return arr[i]; 
        } 
        return -1; 
    } 
      
    // Driver code  
    public static void Main() 
    { 
        int []arr = { 2, 3, 5, 4, 5, 2, 4, 3, 5, 2, 4, 4, 2 }; 
        int n = arr.Length; 
        Console.Write(getOddOccurrence(arr, n)); 
    } 
} 
  
// This code is contributed by Sam007

PHP

<?php 
// PHP program to find the  
// element occurring odd 
// number of times 
  
// Function to find the element  
// occurring odd number of times 
function getOddOccurrence(&$arr, $arr_size) 
{ 
    $count = 0; 
    for ($i = 0;  
         $i < $arr_size; $i++)  
    { 
          
        for ($j = 0; 
             $j < $arr_size; $j++) 
        { 
            if ($arr[$i] == $arr[$j]) 
                $count++; 
        } 
        if ($count % 2 != 0) 
            return $arr[$i]; 
    } 
    return -1; 
} 
  
// Driver code 
$arr = array(2, 3, 5, 4, 5, 2,  
             4, 3, 5, 2, 4, 4, 2); 
$n = sizeof($arr); 
  
// Function calling 
echo(getOddOccurrence($arr, $n)); 
  
// This code is contributed 
// by Shivi_Aggarwal 
?>

输出:

5

更好的解决方案是使用哈希。 使用数组元素作为键,并将其计数作为值。 创建一个空的哈希表。 一对一遍历给定的数组元素并存储计数。 该解决方案的时间复杂度为O(n)。 但是它需要额外的空间来进行哈希处理。

C++

// C++ program to find the element   
// occurring odd number of times  
#include <bits/stdc++.h> 
using namespace std; 
  
// function to find the element  
// occurring odd number of times  
int getOddOccurrence(int arr[],int size) 
{ 
      
    // Defining HashMap in C++ 
    unordered_map<int, int> hash; 
  
    // Putting all elements into the HashMap  
    for(int i = 0; i < size; i++) 
    { 
        hash[arr[i]]++; 
    } 
    // Iterate through HashMap to check an element 
    // occurring odd number of times and return it 
    for(auto i : hash) 
    { 
        if(i.second % 2 != 0) 
        { 
            return i.first; 
        } 
    } 
    return -1; 
} 
  
// Driver code 
int main()  
{  
    int arr[] = { 2, 3, 5, 4, 5, 2, 4, 
                    3, 5, 2, 4, 4, 2 };  
    int n = sizeof(arr) / sizeof(arr[0]);  
      
    // Function calling  
    cout << getOddOccurrence(arr, n);  
  
    return 0;  
}  
  
// This code is contributed by codeMan_d.

Java

// Java program to find the element occurring odd  
// number of times 
import java.io.*; 
import java.util.HashMap; 
  
class OddOccurrence  
{ 
    // function to find the element occurring odd 
    // number of times 
    static int getOddOccurrence(int arr[], int n) 
    { 
        HashMap<Integer,Integer> hmap = new HashMap<>(); 
          
        // Putting all elements into the HashMap 
        for(int i = 0; i < n; i++) 
        { 
            if(hmap.containsKey(arr[i])) 
            { 
                int val = hmap.get(arr[i]); 
                          
                // If array element is already present then 
                // increase the count of that element. 
                hmap.put(arr[i], val + 1);  
            } 
            else
                  
                // if array element is not present then put 
                // element into the HashMap and initialize  
                // the count to one. 
                hmap.put(arr[i], 1);  
        } 
  
        // Checking for odd occurrence of each element present 
        // in the HashMap  
        for(Integer a:hmap.keySet()) 
        { 
            if(hmap.get(a) % 2 != 0) 
                return a; 
        } 
        return -1; 
    } 
          
    // driver code     
    public static void main(String[] args)  
    { 
        int arr[] = new int[]{2, 3, 5, 4, 5, 2, 4, 3, 5, 2, 4, 4, 2}; 
        int n = arr.length; 
        System.out.println(getOddOccurrence(arr, n)); 
    } 
} 
// This code is contributed by Kamal Rawal

Python3

# Python3 program to find the element   
# occurring odd number of times  
   
# function to find the element  
# occurring odd number of times  
def getOddOccurrence(arr,size): 
       
    # Defining HashMap in C++ 
    Hash=dict() 
   
    # Putting all elements into the HashMap  
    for i in range(size): 
        Hash[arr[i]]=Hash.get(arr[i],0) + 1; 
      
    # Iterate through HashMap to check an element 
    # occurring odd number of times and return it 
    for i in Hash: 
  
        if(Hash[i]% 2 != 0): 
            return i 
    return -1
  
   
# Driver code 
arr=[2, 3, 5, 4, 5, 2, 4,3, 5, 2, 4, 4, 2] 
n = len(arr) 
   
# Function calling  
print(getOddOccurrence(arr, n))  
  
# This code is contributed by mohit kumar

C

// C# program to find the element occurring odd  
// number of times 
using System; 
using System.Collections.Generic;  
  
public class OddOccurrence  
{ 
    // function to find the element occurring odd 
    // number of times 
    static int getOddOccurrence(int []arr, int n) 
    { 
        Dictionary<int,int> hmap = new Dictionary<int,int>(); 
          
        // Putting all elements into the HashMap 
        for(int i = 0; i < n; i++) 
        { 
            if(hmap.ContainsKey(arr[i])) 
            { 
                int val = hmap[arr[i]]; 
                          
                // If array element is already present then 
                // increase the count of that element. 
                hmap.Remove(arr[i]); 
                hmap.Add(arr[i], val + 1);  
            } 
            else
                  
                // if array element is not present then put 
                // element into the HashMap and initialize  
                // the count to one. 
                hmap.Add(arr[i], 1);  
        } 
  
        // Checking for odd occurrence of each element present 
        // in the HashMap  
        foreach(KeyValuePair<int, int> entry in hmap) 
        { 
            if(entry.Value % 2 != 0) 
            { 
                return entry.Key; 
            } 
        } 
        return -1; 
    } 
          
    // Driver code  
    public static void Main(String[] args)  
    { 
        int []arr = new int[]{2, 3, 5, 4, 5, 2, 4, 3, 5, 2, 4, 4, 2}; 
        int n = arr.Length; 
        Console.WriteLine(getOddOccurrence(arr, n)); 
    } 
} 
  
// This code is contributed by Princi Singh

输出:

5

最佳解决方案是对所有元素进行按位 XOR。 所有元素的 XOR 给我们奇数出现的元素。 请注意,如果两个元素相同,则两个元素的 XOR 为 0,且数字x与 0 的 XOR 为x

下面是上述方法的实现。

C++

// C++ program to find the element 
// occurring odd number of times 
#include <bits/stdc++.h> 
using namespace std; 
  
// Function to find element occurring 
// odd number of times 
int getOddOccurrence(int ar[], int ar_size) 
{ 
    int res = 0;  
    for (int i = 0; i < ar_size; i++)      
        res = res ^ ar[i]; 
      
    return res; 
} 
  
/* Driver function to test above function */
int main() 
{ 
    int ar[] = {2, 3, 5, 4, 5, 2, 4, 3, 5, 2, 4, 4, 2}; 
    int n = sizeof(ar)/sizeof(ar[0]); 
      
    // Function calling 
    cout << getOddOccurrence(ar, n); 
      
    return 0; 
}

C

// C program to find the element 
// occurring odd number of times 
#include <stdio.h> 
  
// Function to find element occurring 
// odd number of times 
int getOddOccurrence(int ar[], int ar_size) 
{ 
    int res = 0;  
    for (int i = 0; i < ar_size; i++)      
        res = res ^ ar[i]; 
      
    return res; 
} 
  
/* Driver function to test above function */
int main() 
{ 
    int ar[] = {2, 3, 5, 4, 5, 2, 4, 3, 5, 2, 4, 4, 2}; 
    int n = sizeof(ar) / sizeof(ar[0]); 
      
    // Function calling 
    printf("%d", getOddOccurrence(ar, n)); 
    return 0; 
}

Java

//Java program to find the element occurring odd number of times 
  
class OddOccurance  
{ 
    int getOddOccurrence(int ar[], int ar_size)  
    { 
        int i; 
        int res = 0; 
        for (i = 0; i < ar_size; i++)  
        { 
            res = res ^ ar[i]; 
        } 
        return res; 
    } 
  
    public static void main(String[] args)  
    { 
        OddOccurance occur = new OddOccurance(); 
        int ar[] = new int[]{2, 3, 5, 4, 5, 2, 4, 3, 5, 2, 4, 4, 2}; 
        int n = ar.length; 
        System.out.println(occur.getOddOccurrence(ar, n)); 
    } 
} 
// This code has been contributed by Mayank Jaiswal

Python3

# Python program to find the element occurring odd number of times 
  
def getOddOccurrence(arr): 
  
    # Initialize result 
    res = 0
      
    # Traverse the array 
    for element in arr: 
        # XOR with the result 
        res = res ^ element 
  
    return res 
  
# Test array 
arr = [ 2, 3, 5, 4, 5, 2, 4, 3, 5, 2, 4, 4, 2] 
  
print("%d" % getOddOccurrence(arr))

C

// C# program to find the element 
// occurring odd number of times 
using System; 
  
class GFG 
{ 
    // Function to find the element  
    // occurring odd number of times 
    static int getOddOccurrence(int []arr, int arr_size) 
    { 
        int res = 0; 
        for (int i = 0; i < arr_size; i++)  
        { 
            res = res ^ arr[i]; 
        } 
        return res; 
    } 
      
    // Driver code 
    public static void Main() 
    { 
        int []arr = { 2, 3, 5, 4, 5, 2, 4, 3, 5, 2, 4, 4, 2 }; 
        int n = arr.Length; 
        Console.Write(getOddOccurrence(arr, n)); 
    } 
} 
  
// This code is contributed by Sam007

PHP

<?php 
// PHP program to find the  
// element occurring odd  
// number of times 
  
// Function to find element  
// occurring odd number of times 
function getOddOccurrence(&$ar, $ar_size) 
{ 
    $res = 0;  
    for ($i = 0; $i < $ar_size; $i++)      
        $res = $res ^ $ar[$i]; 
      
    return $res; 
} 
  
// Driver Code 
$ar = array(2, 3, 5, 4, 5, 2, 
            4, 3, 5, 2, 4, 4, 2); 
$n = sizeof($ar); 
  
// Function calling 
echo(getOddOccurrence($ar, $n)); 
      
// This code is contributed  
// by Shivi_Aggarwal 
?>

输出:

5

时间复杂度:O(n)