您有N个数字组成的数组,其中N最多为32,000。该数组可能有重复的条目,并且您不知道N是什么。在只有4 KB的可用内存的情况下,如何打印数组中所有重复的元素?
例子:
Input : arr[] = {1, 5, 1, 10, 12, 10}
Output : 1 10
1 and 10 appear more than once in given
array.
Input : arr[] = {50, 40, 50}
Output : 50
询问:亚马逊
我们有4 KB的内存,这意味着我们可以寻址多达8 * 4 * 2 10位。请注意,32 * 2 10位大于32000。我们可以创建一个具有32000位的位,其中每个位代表一个整数。
注意:如果您需要创建一个超过32000位的位,那么可以轻松创建更多且超过32000位的对象;
然后,使用此位向量,我们可以遍历数组,通过将位v设置为1来标记每个元素v。当遇到重复的元素时,我们将其打印出来。
以下是该想法的实现。
C++
// C++ program to print all Duplicates in array
#include
using namespace std;
// A class to represent an array of bits using
// array of integers
class BitArray
{
int *arr;
public:
BitArray() {}
// Constructor
BitArray(int n)
{
// Divide by 32. To store n bits, we need
// n/32 + 1 integers (Assuming int is stored
// using 32 bits)
arr = new int[(n >> 5) + 1];
}
// Get value of a bit at given position
bool get(int pos)
{
// Divide by 32 to find position of
// integer.
int index = (pos >> 5);
// Now find bit number in arr[index]
int bitNo = (pos & 0x1F);
// Find value of given bit number in
// arr[index]
return (arr[index] & (1 << bitNo)) != 0;
}
// Sets a bit at given position
void set(int pos)
{
// Find index of bit position
int index = (pos >> 5);
// Set bit number in arr[index]
int bitNo = (pos & 0x1F);
arr[index] |= (1 << bitNo);
}
// Main function to print all Duplicates
void checkDuplicates(int arr[], int n)
{
// create a bit with 32000 bits
BitArray ba = BitArray(320000);
// Traverse array elements
for (int i = 0; i < n; i++)
{
// Index in bit array
int num = arr[i];
// If num is already present in bit array
if (ba.get(num))
cout << num << " ";
// Else insert num
else
ba.set(num);
}
}
};
// Driver code
int main()
{
int arr[] = {1, 5, 1, 10, 12, 10};
int n = sizeof(arr) / sizeof(arr[0]);
BitArray obj = BitArray();
obj.checkDuplicates(arr, n);
return 0;
}
// This code is contributed by
// sanjeev2552
Java
// Java program to print all Duplicates in array
import java.util.*;
import java.lang.*;
import java.io.*;
// A class to represent array of bits using
// array of integers
class BitArray
{
int[] arr;
// Constructor
public BitArray(int n)
{
// Divide by 32. To store n bits, we need
// n/32 + 1 integers (Assuming int is stored
// using 32 bits)
arr = new int[(n>>5) + 1];
}
// Get value of a bit at given position
boolean get(int pos)
{
// Divide by 32 to find position of
// integer.
int index = (pos >> 5);
// Now find bit number in arr[index]
int bitNo = (pos & 0x1F);
// Find value of given bit number in
// arr[index]
return (arr[index] & (1 << bitNo)) != 0;
}
// Sets a bit at given position
void set(int pos)
{
// Find index of bit position
int index = (pos >> 5);
// Set bit number in arr[index]
int bitNo = (pos & 0x1F);
arr[index] |= (1 << bitNo);
}
// Main function to print all Duplicates
static void checkDuplicates(int[] arr)
{
// create a bit with 32000 bits
BitArray ba = new BitArray(320000);
// Traverse array elements
for (int i=0; i
Python3
# Python3 program to print all Duplicates in array
# A class to represent array of bits using
# array of integers
class BitArray:
# Constructor
def __init__(self, n):
# Divide by 32. To store n bits, we need
# n/32 + 1 integers (Assuming int is stored
# using 32 bits)
self.arr = [0] * ((n >> 5) + 1)
# Get value of a bit at given position
def get(self, pos):
# Divide by 32 to find position of
# integer.
self.index = pos >> 5
# Now find bit number in arr[index]
self.bitNo = pos & 0x1F
# Find value of given bit number in
# arr[index]
return (self.arr[self.index] &
(1 << self.bitNo)) != 0
# Sets a bit at given position
def set(self, pos):
# Find index of bit position
self.index = pos >> 5
# Set bit number in arr[index]
self.bitNo = pos & 0x1F
self.arr[self.index] |= (1 << self.bitNo)
# Main function to print all Duplicates
def checkDuplicates(arr):
# create a bit with 32000 bits
ba = BitArray(320000)
# Traverse array elements
for i in range(len(arr)):
# Index in bit array
num = arr[i]
# If num is already present in bit array
if ba.get(num):
print(num, end = " ")
# Else insert num
else:
ba.set(num)
# Driver Code
if __name__ == "__main__":
arr = [1, 5, 1, 10, 12, 10]
checkDuplicates(arr)
# This code is contributed by
# sanjeev2552
C#
// C# program to print all Duplicates in array
// A class to represent array of bits using
// array of integers
using System;
class BitArray
{
int[] arr;
// Constructor
public BitArray(int n)
{
// Divide by 32. To store n bits, we need
// n/32 + 1 integers (Assuming int is stored
// using 32 bits)
arr = new int[(int)(n >> 5) + 1];
}
// Get value of a bit at given position
bool get(int pos)
{
// Divide by 32 to find position of
// integer.
int index = (pos >> 5);
// Now find bit number in arr[index]
int bitNo = (pos & 0x1F);
// Find value of given bit number in
// arr[index]
return (arr[index] & (1 << bitNo)) != 0;
}
// Sets a bit at given position
void set(int pos)
{
// Find index of bit position
int index = (pos >> 5);
// Set bit number in arr[index]
int bitNo = (pos & 0x1F);
arr[index] |= (1 << bitNo);
}
// Main function to print all Duplicates
static void checkDuplicates(int[] arr)
{
// create a bit with 32000 bits
BitArray ba = new BitArray(320000);
// Traverse array elements
for (int i = 0; i < arr.Length; i++)
{
// Index in bit array
int num = arr[i];
// If num is already present in bit array
if (ba.get(num))
Console.Write(num + " ");
// Else insert num
else
ba.set(num);
}
}
// Driver code
public static void Main()
{
int[] arr = {1, 5, 1, 10, 12, 10};
checkDuplicates(arr);
}
}
// This code is contributed by Rajput-Ji
输出:
1 10