Suma de números obtenidos por el conteo de bits establecidos y no establecidos en elementos de array diagonal

Dada una array cuadrada mat[][] de dimensión N*N , convierta los elementos presentes en ambas diagonales a sus respectivas representaciones binarias y realice las siguientes operaciones:

  • Para cada posición de bits, cuente el número de bits establecidos y no establecidos en esas representaciones binarias .
  • Si el conteo de bits establecidos excede el de bits no establecidos, coloque 0 en esa posición para un nuevo número. De lo contrario, coloque 1 en esa posición.
  • Finalmente, imprima la suma de los dos números generados.

Ejemplos:

Entrada: mat[][] = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Salida: 8
Explicación:
Para la diagonal primaria, la representación binaria de cada elemento es :
1 = (0001) 2
5 = (0101) 2
9 = (1001) 2
En la posición de bit 0, número de bits establecidos (=3)>número de bits no establecidos (=0)
En la posición de bit 1, número de bits establecidos (= 0) <número de bits no establecidos (= 3)
En la posición de bit 2, número de bits establecidos (= 1) <número de bits no establecidos (= 2)
En la posición de bit 3, número de bits establecidos (=1)<número de bits no establecidos(=2)
Por lo tanto, después de procesar la diagonal primaria, el número generado es (0001) 2 = 1.
Para la diagonal secundaria, la representación binaria de cada elemento es:
3 = (011) 2
5 = (101) 2
7 = (111) 2
En la posición de bit 0, número de bits establecidos (= 3)>número de bits no establecidos bits (= 0)
En la posición de bit 1, número de bits establecidos (= 2)> número de bits no establecidos (= 1)
En la posición de bit 2, número de bits establecidos (= 2)> número de bits no establecidos ( =1)
Por lo tanto, después de procesar la diagonal principal, el número generado es (111) 2 = 7.
Por lo tanto, la suma requerida = 1 + 7 = 8. 

Entrada: mat[][] = [[2, 3], [3, 9]]
Salida: 3

Enfoque ingenuo: el enfoque más simple es atravesar la array y almacenar los elementos diagonales primarios en una array y los elementos diagonales secundarios en otra array. Luego encuentre la suma de los números generados al iterar sobre los bits establecidos de los elementos en ambas arrays. 
Complejidad de Tiempo: O(N 2 )
Espacio Auxiliar: O(1) 

Enfoque eficiente: el enfoque anterior se puede optimizar encontrando los elementos diagonales usando un solo bucle . Siga los pasos a continuación para resolver el problema:

  • Para los elementos de la Diagonal Principal: Itere un bucle hasta N , donde N es el número de columnas, y almacene mat[i][i] donde i es la variable de índice.
  • Para elementos diagonales secundarios: itere un ciclo hasta N , donde N es el número de columnas y almacene mat[i][k] , donde i es la variable de índice y K = N – 1 . Disminuir K hasta i < N .

Para encontrar los números para cada conjunto de elementos diagonales, realice los siguientes pasos:

  • Inicialice una variable, digamos ans como 0 , para almacenar el número resultante.
  • Itere sobre el rango [0, 31] usando la variable i y realice lo siguiente:
    • Inicialice S y NS como 0 , para almacenar el número de bits establecidos y no establecidos, respectivamente, en la posición i .
    • Atraviese los elementos diagonales usando la variable j y si arr[j] se establece en la posición i , incremente S en 1 , de lo contrario incremente NS en 1 .
    • Si el valor de S es mayor que NS , establezca el bit en la posición i de ans .
  • Después de completar los pasos anteriores, el valor de ans es el número generado para cada conjunto de elementos diagonales.
  • Repita los pasos anteriores para los otros conjuntos de elementos diagonales e imprima la suma de los dos números generados.

A continuación se muestra la implementación del enfoque anterior:

C++

// CPP program for the above approach
#include<bits/stdc++.h>
using namespace std;
 
// Function to find the number after
// processing the diagonal elements
int processDiagonal(vector<int>arr)
{
   
  // Store the required number
  int ans = 0;
   
  int getBit = 1;
   
  // Checking for each position
  for (int i = 0; i < 32; i++)
  {
 
   // Store the number of set bits
    // & non-set bits at position i
    int S = 0;
    int NS = 0;
     
    // Traverse the diagonal elements
    for(auto j: arr)
    {
       
         // Update count of S if current
      // element is set at position i
      if (getBit&j)
        S += 1;
         
      // Else update NS
      else
        NS += 1;
    }
    // If number of set bits is >
    // number of non-set bits, add
    // set bits value to the ans
    if(S > NS)
      ans += pow(2,i);
    getBit <<= 1;
 
  }
     
  // Return the answer
  return ans;
}
 
// Function to find the sum of the
// numbers generated after processing
// both the diagonals of the matrix
int findSum(vector<vector<int>>mat)
{
     
  int i = 0;
  int j = 0;
   
  // Store the primary diagonal elements
  vector<int> priDiag;
   
  while(i<mat.size()){
    priDiag.push_back(mat[i][j]);
    i += 1;
    j += 1;
  }
     
  i = 0;
  j = mat.size()-1;
   
  // Store the secondary diagonal elements
  vector<int> secDiag;
  while(i<mat.size()){
    secDiag.push_back(mat[i][j]);
    i += 1;
    j -= 1;
  }
     
  // Function Call to get the required
  // numbers and return their sum
  return processDiagonal(priDiag) + processDiagonal(secDiag);
 
}
 
// Driver Code
int main(){
vector<vector<int>>mat{{1, 2, 3},{4, 5, 6},{7, 8, 9}};
 
// Function Call
cout<<findSum(mat)<<endl;
}
 
// This code is contributed by bgangwar59.

Java

// Java program for the above approach
import java.util.*;
 
class GFG
{
 
  // Functino to find the number after
  // processing the diagonal elements
  static int processDiagonal(ArrayList<Integer> arr)
  {
 
    // Store the required number
    int ans = 0;
 
    int getBit = 1;
 
    // Checking for each position
    for (int i = 0; i < 32; i++)
    {
 
      // Store the number of set bits
      // & non-set bits at position i
      int S = 0;
      int NS = 0;
 
      // Traverse the diagonal elements
      for(int j: arr)
      {
 
        // Update count of S if current
        // element is set at position i
        if ((getBit&j) != 0)
          S += 1;
 
        // Else update NS
        else
          NS += 1;
      }
      // If number of set bits is >
      // number of non-set bits, add
      // set bits value to the ans
      if(S > NS)
        ans += Math.pow(2,i);
      getBit <<= 1;
 
    }
 
    // Return the answer
    return ans;
  }
 
  // Function to find the sum of the
  // numbers generated after processing
  // both the diagonals of the matrix
  static int findSum(int[][] mat)
  {
 
    int i = 0;
    int j = 0;
 
    // Store the primary diagonal elements
    ArrayList<Integer> priDiag
      = new ArrayList<Integer>();
 
    while(i<mat.length){
      priDiag.add(mat[i][j]);
      i += 1;
      j += 1;
    }
 
    i = 0;
    j = mat.length - 1;
 
    // Store the secondary diagonal elements
    ArrayList<Integer> secDiag
      = new ArrayList<Integer>();
    while(i<mat.length){
      secDiag.add(mat[i][j]);
      i += 1;
      j -= 1;
    }
 
    // Function Call to get the required
    // numbers and return their sum
    return (processDiagonal(priDiag) + processDiagonal(secDiag));
 
  }
 
  // Driver Code
  public static void main(String[] args)
  {
    int[][] mat= {{1, 2, 3},{4, 5, 6},{7, 8, 9}};
 
    // Function Call
    System.out.print(findSum(mat));
  }
}
 
// This code is contributed by splevel62.

Python3

# Python program for the above approach
 
# Functino to find the number after
# processing the diagonal elements
def processDiagonal(arr):
   
  # Store the required number
  ans = 0
   
  getBit = 1
   
  # Checking for each position
  for i in range(32):
     
    # Store the number of set bits
    # & non-set bits at position i
    S = 0
    NS = 0
     
    # Traverse the diagonal elements
    for j in arr:
       
      # Update count of S if current
      # element is set at position i
      if getBit&j:
        S += 1
         
      # Else update NS
      else:
        NS += 1
     
    # If number of set bits is >
    # number of non-set bits, add
    # set bits value to the ans
    if S > NS:
      ans += 2**i
    getBit <<= 1
     
  # Return the answer
  return ans
 
# Function to find the sum of the
# numbers generated after processing
# both the diagonals of the matrix
def findSum(mat):
  i = 0
  j = 0
   
  # Store the primary diagonal elements
  priDiag = []
   
  while i<len(mat):
    priDiag.append(mat[i][j])
    i += 1
    j += 1
     
  i = 0
  j = len(mat)-1
   
  # Store the secondary diagonal elements
  secDiag = []
  while i<len(mat):
    secDiag.append(mat[i][j])
    i += 1
    j -= 1
     
  # Function Call to get the required
  # numbers and return their sum
  return processDiagonal(priDiag) + processDiagonal(secDiag)
 
# Driver Code
mat = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
 
# Function Call
print(findSum(mat))

C#

// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG {
 
  // Functino to find the number after
  // processing the diagonal elements
  static int processDiagonal(List<int> arr)
  {
 
    // Store the required number
    int ans = 0;
 
    int getBit = 1;
 
    // Checking for each position
    for (int i = 0; i < 32; i++) {
 
      // Store the number of set bits
      // & non-set bits at position i
      int S = 0;
      int NS = 0;
 
      // Traverse the diagonal elements
      foreach(int j in arr)
      {
 
        // Update count of S if current
        // element is set at position i
        if ((getBit & j) != 0)
          S += 1;
 
        // Else update NS
        else
          NS += 1;
      }
      // If number of set bits is >
      // number of non-set bits, add
      // set bits value to the ans
      if (S > NS)
        ans += (int)Math.Pow(2, i);
      getBit <<= 1;
    }
 
    // Return the answer
    return ans;
  }
 
  // Function to find the sum of the
  // numbers generated after processing
  // both the diagonals of the matrix
  static int findSum(int[, ] mat)
  {
 
    int i = 0;
    int j = 0;
 
    // Store the primary diagonal elements
    List<int> priDiag = new List<int>();
 
    while (i < mat.GetLength(0)) {
      priDiag.Add(mat[i, j]);
      i += 1;
      j += 1;
    }
 
    i = 0;
    j = mat.GetLength(0) - 1;
 
    // Store the secondary diagonal elements
    List<int> secDiag = new List<int>();
    while (i < mat.GetLength(0)) {
      secDiag.Add(mat[i, j]);
      i += 1;
      j -= 1;
    }
 
    // Function Call to get the required
    // numbers and return their sum
    return (processDiagonal(priDiag)
            + processDiagonal(secDiag));
  }
 
  // Driver Code
  public static void Main(string[] args)
  {
    int[, ] mat
      = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
 
    // Function Call
    Console.Write(findSum(mat));
  }
}
 
// This code is contributed by ukasp.

Javascript

<script>
 
// JavaScript program for the above approach
 
// Functino to find the number after
// processing the diagonal elements
function processDiagonal(arr)
{
   
  // Store the required number
  let ans = 0;
   
  let getBit = 1;
   
  // Checking for each position
  for (let i = 0; i < 32; i++)
  {
 
   // Store the number of set bits
    // & non-set bits at position i
    let S = 0;
    let NS = 0;
     
    // Traverse the diagonal elements
    for(let j = 0; j < arr.length; j++)
    {
       
         // Update count of S if current
      // element is set at position i
      if (getBit & arr[j])
        S += 1;
         
      // Else update NS
      else
        NS += 1;
    }
    // If number of set bits is >
    // number of non-set bits, add
    // set bits value to the ans
    if(S > NS)
      ans += Math.pow(2,i);
    getBit <<= 1;
 
  }
     
  // Return the answer
  return ans;
}
 
// Function to find the sum of the
// numbers generated after processing
// both the diagonals of the matrix
function findSum(mat)
{
     
  let i = 0;
  let j = 0;
   
  // Store the primary diagonal elements
  let priDiag = [];
   
  while(i<mat.length){
    priDiag.push(mat[i][j]);
    i += 1;
    j += 1;
  }
     
  i = 0;
  j = mat.length - 1;
   
  // Store the secondary diagonal elements
  let secDiag = [];
  while(i<mat.length){
    secDiag.push(mat[i][j]);
    i += 1;
    j -= 1;
  }
     
  // Function Call to get the required
  // numbers and return their sum
  return processDiagonal(priDiag) + processDiagonal(secDiag);
 
}
 
// Driver Code
let mat = [[1, 2, 3],[4, 5, 6],[7, 8, 9]];
 
// Function Call
document.write(findSum(mat));
 
</script>
Producción: 

8

 

Complejidad temporal: O(N)
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por rohitsingh07052 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *