Find original array from encrypted array (An array of sums of other elements)
Find original array from a given encrypted array of size n. Encrypted array is obtained by replacing each element of the original array by the sum of the remaining array elements.
Examples :
Input : arr[] = {10, 14, 12, 13, 11}
Output : {5, 1, 3, 2, 4}
Original array {5, 1, 3, 2, 4}
Encrypted array is obtained as:
= {1+3+2+4, 5+3+2+4, 5+1+2+4, 5+1+3+4, 5+1+3+2}
= {10, 14, 12, 13, 11}
Each element of original array is replaced by the
sum of the remaining array elements.
Input : arr[] = {95, 107, 103, 88, 110, 87}
Output : {23, 11, 15, 30, 8, 31}
Approach is purely based on arithmetic observations which are illustrated below:
Let n = 4, and
the original array be ori[] = {a, b, c, d}
encrypted array is given as:
arr[] = {b+c+d, a+c+d, a+b+d, a+b+c}
Elements of encrypted array are :
arr[0] = (b+c+d), arr[1] = (a+c+d),
arr[2] = (a+b+d), arr[3] = (a+b+c)
add up all the elements
sum = arr[0] + arr[1] + arr[2] + arr[3]
= (b+c+d) + (a+c+d) + (a+b+d) + (a+b+c)
= 3(a+b+c+d)
Sum of elements of ori[] = sum / n-1
= sum/3
= (a+b+c+d)
Thus, for a given encrypted array arr[] of size n, the sum of
the elements of the original array ori[] can be calculated as:
sum = (arr[0]+arr[1]+....+arr[n-1]) / (n-1)
Then, elements of ori[] are calculated as:
ori[0] = sum - arr[0]
ori[1] = sum - arr[1]
.
.
ori[n-1] = sum - arr[n-1]
Below is the implementation of above steps.
C++
#include <bits/stdc++.h>
using namespace std;
void findAndPrintOriginalArray( int arr[], int n)
{
int arr_sum = 0;
for ( int i=0; i<n; i++)
arr_sum += arr[i];
arr_sum = arr_sum/(n-1);
for ( int i=0; i<n; i++)
cout << (arr_sum - arr[i]) << " " ;
}
int main()
{
int arr[] = {10, 14, 12, 13, 11};
int n = sizeof (arr) / sizeof (arr[0]);
findAndPrintOriginalArray(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG {
static void findAndPrintOriginalArray( int arr[], int n)
{
int arr_sum = 0 ;
for ( int i = 0 ; i < n; i++) {
arr_sum += arr[i];
}
arr_sum = arr_sum / (n - 1 );
for ( int i = 0 ; i < n; i++) {
System.out.print(arr_sum - arr[i] + " " );
}
}
public static void main(String[] args)
{
int arr[] = { 10 , 14 , 12 , 13 , 11 };
int n = arr.length;
findAndPrintOriginalArray(arr, n);
}
}
|
Python 3
def findAndPrintOriginalArray(arr, n):
arr_sum = 0
for i in range ( 0 , n):
arr_sum + = arr[i]
arr_sum = int (arr_sum / (n - 1 ))
for i in range ( 0 , n):
print ((arr_sum - arr[i]),
end = " " )
arr = [ 10 , 14 , 12 , 13 , 11 ]
n = len (arr)
findAndPrintOriginalArray(arr, n)
|
C#
using System;
class GFG {
static void findAndPrintOriginalArray( int []arr,
int n)
{
int arr_sum = 0;
for ( int i = 0; i < n; i++)
arr_sum += arr[i];
arr_sum = arr_sum / (n - 1);
for ( int i = 0; i < n; i++)
Console.Write(arr_sum - arr[i] + " " );
}
public static void Main (String[] args)
{
int []arr = {10, 14, 12, 13, 11};
int n =arr.Length;
findAndPrintOriginalArray(arr, n);
}
}
|
PHP
<?php
function findAndPrintOriginalArray( $arr , $n )
{
$arr_sum = 0;
for ( $i = 0; $i < $n ; $i ++)
$arr_sum += $arr [ $i ];
$arr_sum = $arr_sum / ( $n - 1);
for ( $i = 0; $i < $n ; $i ++)
echo $arr_sum - $arr [ $i ] , " " ;
}
$arr = array (10, 14, 12, 13, 11);
$n = count ( $arr );
findAndPrintOriginalArray( $arr , $n );
?>
|
Javascript
<script>
function findAndPrintOriginalArray(arr, n)
{
let arr_sum = 0;
for (let i = 0; i < n; i++)
arr_sum += arr[i];
arr_sum = parseInt(arr_sum / (n - 1), 10);
for (let i = 0; i < n; i++)
document.write(arr_sum - arr[i] + " " );
}
let arr = [10, 14, 12, 13, 11];
let n =arr.length;
findAndPrintOriginalArray(arr, n);
</script>
|
Time complexity: O(N)
Auxiliary Space: O(1)
Last Updated :
11 Jul, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...