从数字数组|集合2(O(n)时间和O(1)空间)中找出3的最大倍数

给定一个数字数组(包含从0到9的元素)。找到可以从中生成的最大数字 部分或全部数字 可以被3整除。同一个元素可能在数组中出现多次,但数组中的每个元素只能使用一次。 例如:

null
Input : arr[] = {5, 4, 3, 1, 1} 
Output : 4311

Input : Arr[] = {5, 5, 5, 7} 
Output : 555 

被问到: 谷歌采访

我们讨论了一个问题 基于队列的解决方案 .这两种解决方案(在之前和本文中讨论过)都基于以下事实: 一个数可被3整除的充要条件是该数的位数之和可被3整除。 例如,让我们考虑555,它是可除3的,因为数字的总和是5 + 5 + 5=15,这可以被3除除。如果数字之和不能被3整除,那么余数应该是1或2。 如果我们得到余数“1”或“2”,我们必须去掉最多两个数字,使一个数字可以被3整除:

  1. 如果余数为“1”:我们必须删除余数为“1”的单个数字,或者必须删除余数为“2”的两个数字(2+2=>4%3=>1)
  2. 如果余数为“2”:。我们必须删除余数为“2”的单个数字,或者必须删除余数为“1”的两个数字(1+1=>2%3=>2)。

例如:

Input : arr[] = 5, 5, 5, 7 
Sum of digits = 5 + 5 + 5 + 7 = 22
Remainder = 22 % 3 = 1 
We remove smallest single digit that 
has remainder '1'. We remove 7 % 3 = 1 
So largest number divisible by 3 is : 555

Let's take an another example :
Input : arr[]  = 4 , 4 , 1 , 1 , 1 , 3
Sum of digits  = 4 + 4 + 1 + 1 + 1 + 3 = 14
Reminder = 14 % 3 = 2 
We have to remove the smallest digit that 
has remainder ' 2 ' or two digits that have
remainder '1'. Here there is no digit with 
reminder '2', so we have to remove two smallest 
digits that have remainder '1'. The digits are : 
1, 1. So largest number divisible by 3 is 4 4 3 1 

下面是上述想法的实现。

C++

// C++ program to find the largest number
// that can be mode from elements of the
// array and is divisible by 3
#include<bits/stdc++.h>
using namespace std;
// Number of digits
#define MAX_SIZE 10
// function to sort array of digits using
// counts
void sortArrayUsingCounts( int arr[], int n)
{
// Store count of all elements
int count[MAX_SIZE] = {0};
for ( int i = 0; i < n; i++)
count[arr[i]]++;
// Store
int index = 0;
for ( int i = 0; i < MAX_SIZE; i++)
while (count[i] > 0)
arr[index++] = i, count[i]--;
}
// Remove elements from arr[] at indexes ind1 and ind2
bool removeAndPrintResult( int arr[], int n, int ind1,
int ind2 = -1)
{
for ( int i = n-1; i >=0; i--)
if (i != ind1 && i != ind2)
cout << arr[i] ;
}
// Returns largest multiple of 3 that can be formed
// using arr[] elements.
bool largest3Multiple( int arr[], int n)
{
// Sum of all array element
int sum = accumulate(arr, arr+n, 0);
// Sort array element in increasing order
sortArrayUsingCounts(arr, n);
// Sum is divisible by 3 , no need to
// delete an element
if (sum%3 == 0)
{
removeAndPrintResult(arr,n,-1,-1);
return true ;
}
// Find reminder
int remainder = sum % 3;
// If remainder is '1', we have to delete either
// one element of remainder '1' or two elements
// of remainder '2'
if (remainder == 1)
{
int rem_2[2];
rem_2[0] = -1, rem_2[1] = -1;
// Traverse array elements
for ( int i = 0 ; i < n ; i++)
{
// Store first element of remainder '1'
if (arr[i]%3 == 1)
{
removeAndPrintResult(arr, n, i);
return true ;
}
if (arr[i]%3 == 2)
{
// If this is first occurrence of remainder 2
if (rem_2[0] == -1)
rem_2[0] = i;
// If second occurrence
else if (rem_2[1] == -1)
rem_2[1] = i;
}
}
if (rem_2[0] != -1 && rem_2[1] != -1)
{
removeAndPrintResult(arr, n, rem_2[0], rem_2[1]);
return true ;
}
}
// If remainder is '2', we have to delete either
// one element of remainder '2' or two elements
// of remainder '1'
else if (remainder == 2)
{
int rem_1[2];
rem_1[0] = -1, rem_1[1] = -1;
// traverse array elements
for ( int i = 0; i < n; i++)
{
// store first element of remainder '2'
if (arr[i]%3 == 2)
{
removeAndPrintResult(arr, n, i);
return true ;
}
if (arr[i]%3 == 1)
{
// If this is first occurrence of remainder 1
if (rem_1[0] == -1)
rem_1[0] = i;
// If second occurrence
else if (rem_1[1] == -1)
rem_1[1] = i;
}
}
if (rem_1[0] != -1 && rem_1[1] != -1)
{
removeAndPrintResult(arr, n, rem_1[0], rem_1[1]);
return true ;
}
}
cout << "Not possible" ;
return false ;
}
// Driver code
int main()
{
int arr[] = {4, 4, 1, 1, 1, 3 } ;
int n = sizeof (arr)/ sizeof (arr[0]);
largest3Multiple(arr, n);
return 0;
}


JAVA

// Java program to find the largest number
// that can be mode from elements of the
// array and is divisible by 3
import java.util.*;
class GFG
{
// Number of digits
static int MAX_SIZE = 10 ;
// function to sort array of digits using
// counts
static void sortArrayUsingCounts( int arr[],
int n)
{
// Store count of all elements
int [] count = new int [MAX_SIZE];
for ( int i = 0 ; i < n; i++)
{
count[arr[i]]++;
}
// Store
int index = 0 ;
for ( int i = 0 ; i < MAX_SIZE; i++)
{
while (count[i] > 0 )
{
arr[index++] = i;
count[i]--;
}
}
}
// Remove elements from arr[]
// at indexes ind1 and ind2
static void removeAndPrintResult( int arr[], int n,
int ind1, int ind2)
{
for ( int i = n - 1 ; i >= 0 ; i--)
{
if (i != ind1 && i != ind2)
{
System.out.print(arr[i]);
}
}
}
// Returns largest multiple of 3
// that can be formed using
// arr[] elements.
static boolean largest3Multiple( int arr[],
int n)
{
// Sum of all array element
int sum = accumulate(arr, 0 , n);
// Sort array element in increasing order
sortArrayUsingCounts(arr, n);
// If sum is divisible by 3,
// no need to delete an element
if (sum % 3 == 0 )
{
removeAndPrintResult(arr, n, - 1 , - 1 );
return true ;
}
// Find reminder
int remainder = sum % 3 ;
// If remainder is '1', we have to
// delete either one element of
// remainder '1' or two elements of
// remainder '2'
if (remainder == 1 )
{
int [] rem_2 = new int [ 2 ];
rem_2[ 0 ] = - 1 ;
rem_2[ 1 ] = - 1 ;
// Traverse array elements
for ( int i = 0 ; i < n; i++)
{
// Store first element of remainder '1'
if (arr[i] % 3 == 1 )
{
removeAndPrintResult(arr, n, i, - 1 );
return true ;
}
if (arr[i] % 3 == 2 )
{
// If this is first occurrence
// of remainder 2
if (rem_2[ 0 ] == - 1 )
{
rem_2[ 0 ] = i;
}
// If second occurrence
else if (rem_2[ 1 ] == - 1 )
{
rem_2[ 1 ] = i;
}
}
}
if (rem_2[ 0 ] != - 1 &&
rem_2[ 1 ] != - 1 )
{
removeAndPrintResult(arr, n, rem_2[ 0 ],
rem_2[ 1 ]);
return true ;
}
}
// If remainder is '2', we have to
// delete either one element of
// remainder '2' or two elements of
// remainder '1'
else if (remainder == 2 )
{
int [] rem_1 = new int [ 2 ];
rem_1[ 0 ] = - 1 ;
rem_1[ 1 ] = - 1 ;
// traverse array elements
for ( int i = 0 ; i < n; i++)
{
// store first element of remainder '2'
if (arr[i] % 3 == 2 )
{
removeAndPrintResult(arr, n, i, - 1 );
return true ;
}
if (arr[i] % 3 == 1 )
{
// If this is first occurrence
// of remainder 1
if (rem_1[ 0 ] == - 1 )
{
rem_1[ 0 ] = i;
}
// If second occurrence
else if (rem_1[ 1 ] == - 1 )
{
rem_1[ 1 ] = i;
}
}
}
if (rem_1[ 0 ] != - 1 &&
rem_1[ 1 ] != - 1 )
{
removeAndPrintResult(arr, n, rem_1[ 0 ],
rem_1[ 1 ]);
return true ;
}
}
System.out.print( "Not possible" );
return false ;
}
static int accumulate( int [] arr,
int start,
int end)
{
int sum = 0 ;
for ( int i = 0 ; i < arr.length; i++)
{
sum += arr[i];
}
return sum;
}
// Driver code
public static void main(String[] args)
{
int arr[] = { 4 , 4 , 1 , 1 , 1 , 3 };
int n = arr.length;
largest3Multiple(arr, n);
}
}


Python3

# Python3 program to find the largest number
# that can be mode from elements of the
# array and is divisible by 3
# Number of digits
MAX_SIZE = 10
# function to sort array of digits using
# counts
def sortArrayUsingCounts(arr, n):
# Store count of all elements
count = [ 0 ] * MAX_SIZE
for i in range (n):
count[arr[i]] + = 1
# Store
index = 0
for i in range (MAX_SIZE):
while count[i] > 0 :
arr[index] = i
index + = 1
count[i] - = 1
# Remove elements from arr[] at indexes ind1 and ind2
def removeAndPrintResult(arr, n, ind1, ind2 = - 1 ):
for i in range (n - 1 , - 1 , - 1 ):
if i ! = ind1 and i ! = ind2:
print (arr[i], end = "")
# Returns largest multiple of 3 that can be formed
# using arr[] elements.
def largest3Multiple(arr, n):
# Sum of all array element
s = sum (arr)
# Sort array element in increasing order
sortArrayUsingCounts(arr, n)
# Sum is divisible by 3, no need to
# delete an element
if s % 3 = = 0 :
removeAndPrintResult(arr, n, - 1 )
return True
# Find reminder
remainder = s % 3
# If remainder is '1', we have to delete either
# one element of remainder '1' or two elements
# of remainder '2'
if remainder = = 1 :
rem_2 = [ 0 ] * 2
rem_2[ 0 ] = - 1 ; rem_2[ 1 ] = - 1
# Traverse array elements
for i in range (n):
# Store first element of remainder '1'
if arr[i] % 3 = = 1 :
removeAndPrintResult(arr, n, i)
return True
if arr[i] % 3 = = 2 :
# If this is first occurrence of remainder 2
if rem_2[ 0 ] = = - 1 :
rem_2[ 0 ] = i
# If second occurrence
elif rem_2[ 1 ] = = - 1 :
rem_2[ 1 ] = i
if rem_2[ 0 ] ! = - 1 and rem_2[ 1 ] ! = - 1 :
removeAndPrintResult(arr, n, rem_2[ 0 ], rem_2[ 1 ])
return True
# If remainder is '2', we have to delete either
# one element of remainder '2' or two elements
# of remainder '1'
elif remainder = = 2 :
rem_1 = [ 0 ] * 2
rem_1[ 0 ] = - 1 ; rem_1[ 1 ] = - 1
# traverse array elements
for i in range (n):
# store first element of remainder '2'
if arr[i] % 3 = = 2 :
removeAndPrintResult(arr, n, i)
return True
if arr[i] % 3 = = 1 :
# If this is first occurrence of remainder 1
if rem_1[ 0 ] = = - 1 :
rem_1[ 0 ] = i
# If second occurrence
elif rem_1[ 1 ] = = - 1 :
rem_1[ 1 ] = i
if rem_1[ 0 ] ! = - 1 and rem_1[ 1 ] ! = - 1 :
removeAndPrintResult(arr, n, rem_1[ 0 ], rem_1[ 1 ])
return True
print ( "Not possible" )
return False
# Driver code
if __name__ = = "__main__" :
arr = [ 4 , 4 , 1 , 1 , 1 , 3 ]
n = len (arr)
largest3Multiple(arr, n)
# This code is contributed by
# sanjeev2552


C#

// C# program to find the largest number
// that can be mode from elements of the
// array and is divisible by 3
using System;
class GFG
{
// Number of digits
static int MAX_SIZE = 10;
// function to sort array of digits using
// counts
static void sortArrayUsingCounts( int []arr,
int n)
{
// Store count of all elements
int [] count = new int [MAX_SIZE];
for ( int i = 0; i < n; i++)
{
count[arr[i]]++;
}
// Store
int index = 0;
for ( int i = 0; i < MAX_SIZE; i++)
{
while (count[i] > 0)
{
arr[index++] = i;
count[i]--;
}
}
}
// Remove elements from arr[]
// at indexes ind1 and ind2
static void removeAndPrintResult( int []arr, int n,
int ind1, int ind2)
{
for ( int i = n - 1; i >= 0; i--)
{
if (i != ind1 && i != ind2)
{
Console.Write(arr[i]);
}
}
}
// Returns largest multiple of 3
// that can be formed using
// arr[] elements.
static Boolean largest3Multiple( int []arr,
int n)
{
// Sum of all array element
int sum = accumulate(arr, 0, n);
// Sort array element in increasing order
sortArrayUsingCounts(arr, n);
// If sum is divisible by 3,
// no need to delete an element
if (sum % 3 == 0)
{
removeAndPrintResult(arr, n, -1, -1);
return true ;
}
// Find reminder
int remainder = sum % 3;
// If remainder is '1', we have to
// delete either one element of
// remainder '1' or two elements of
// remainder '2'
if (remainder == 1)
{
int [] rem_2 = new int [2];
rem_2[0] = -1;
rem_2[1] = -1;
// Traverse array elements
for ( int i = 0; i < n; i++)
{
// Store first element of remainder '1'
if (arr[i] % 3 == 1)
{
removeAndPrintResult(arr, n, i, -1);
return true ;
}
if (arr[i] % 3 == 2)
{
// If this is first occurrence
// of remainder 2
if (rem_2[0] == -1)
{
rem_2[0] = i;
}
// If second occurrence
else if (rem_2[1] == -1)
{
rem_2[1] = i;
}
}
}
if (rem_2[0] != -1 &&
rem_2[1] != -1)
{
removeAndPrintResult(arr, n, rem_2[0],
rem_2[1]);
return true ;
}
}
// If remainder is '2', we have to
// delete either one element of
// remainder '2' or two elements of
// remainder '1'
else if (remainder == 2)
{
int [] rem_1 = new int [2];
rem_1[0] = -1;
rem_1[1] = -1;
// traverse array elements
for ( int i = 0; i < n; i++)
{
// store first element of remainder '2'
if (arr[i] % 3 == 2)
{
removeAndPrintResult(arr, n, i, -1);
return true ;
}
if (arr[i] % 3 == 1)
{
// If this is first occurrence
// of remainder 1
if (rem_1[0] == -1)
{
rem_1[0] = i;
}
// If second occurrence
else if (rem_1[1] == -1)
{
rem_1[1] = i;
}
}
}
if (rem_1[0] != -1 &&
rem_1[1] != -1)
{
removeAndPrintResult(arr, n, rem_1[0],
rem_1[1]);
return true ;
}
}
Console.Write( "Not possible" );
return false ;
}
static int accumulate( int [] arr,
int start,
int end)
{
int sum = 0;
for ( int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
return sum;
}
// Driver code
public static void Main(String[] args)
{
int []arr = {4, 4, 1, 1, 1, 3};
int n = arr.Length;
largest3Multiple(arr, n);
}
}
// This code is contributed by 29AjayKumar


Javascript

<script>
// JavaScript program to find the largest number
// that can be mode from elements of the
// array and is divisible by 3
// Number of digits
const MAX_SIZE = 10;
// function to sort array of digits using
// counts
function sortArrayUsingCounts(arr, n)
{
// Store count of all elements
let count = new Uint8Array(MAX_SIZE);
for (let i = 0; i < n; i++)
count[arr[i]]++;
// Store
let index = 0;
for (let i = 0; i < MAX_SIZE; i++)
while (count[i] > 0)
arr[index++] = i, count[i]--;
}
// Remove elements from arr[] at indexes ind1 and ind2
function removeAndPrintResult(arr, n, ind1, ind2 = -1)
{
for (let i = n-1; i >=0; i--)
if (i != ind1 && i != ind2)
document.write(arr[i]) ;
}
// Returns largest multiple of 3 that can be formed
// using arr[] elements.
function largest3Multiple(arr, n)
{
// Sum of all array element
let sum = arr.reduce((a, b) => a + b, 0);
// Sort array element in increasing order
sortArrayUsingCounts(arr, n);
// Sum is divisible by 3 , no need to
// delete an element
if (sum%3 == 0)
{
removeAndPrintResult(arr, n, -1);
return true ;
}
// Find reminder
let remainder = sum % 3;
// If remainder is '1', we have to delete either
// one element of remainder '1' or two elements
// of remainder '2'
if (remainder == 1)
{
let rem_2 = new Array(2);
rem_2[0] = -1, rem_2[1] = -1;
// Traverse array elements
for (let i = 0 ; i < n ; i++)
{
// Store first element of remainder '1'
if (arr[i]%3 == 1)
{
removeAndPrintResult(arr, n, i);
return true ;
}
if (arr[i]%3 == 2)
{
// If this is first occurrence of remainder 2
if (rem_2[0] == -1)
rem_2[0] = i;
// If second occurrence
else if (rem_2[1] == -1)
rem_2[1] = i;
}
}
if (rem_2[0] != -1 && rem_2[1] != -1)
{
removeAndPrintResult(arr, n, rem_2[0], rem_2[1]);
return true ;
}
}
// If remainder is '2', we have to delete either
// one element of remainder '2' or two elements
// of remainder '1'
else if (remainder == 2)
{
let rem_1 = new Array(2);
rem_1[0] = -1, rem_1[1] = -1;
// traverse array elements
for (let i = 0; i < n; i++)
{
// store first element of remainder '2'
if (arr[i]%3 == 2)
{
removeAndPrintResult(arr, n, i);
return true ;
}
if (arr[i]%3 == 1)
{
// If this is first occurrence of remainder 1
if (rem_1[0] == -1)
rem_1[0] = i;
// If second occurrence
else if (rem_1[1] == -1)
rem_1[1] = i;
}
}
if (rem_1[0] != -1 && rem_1[1] != -1)
{
removeAndPrintResult(arr, n, rem_1[0], rem_1[1]);
return true ;
}
}
document.write( "Not possible" );
return false ;
}
// Driver code
let arr = [4 , 4 , 1 , 1 , 1 , 3];
let n = arr.length;
largest3Multiple(arr, n);
// This code is contributed by Surbhi Tyagi.
</script>


输出:

4431

时间复杂性: O(n) 本文由 尼桑·辛格 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享