📌  相关文章
📜  生成一个数组,其中包含通过交换位最大化的元素

📅  最后修改于: 2021-05-07 09:48:40             🧑  作者: Mango

给定一个数组arr [] ,任务是生成一个修改后的数组,以便通过交换位来最大化其所有元素。
例子:

方法:
请按照以下步骤解决问题:

  • 计算每个数组元素中设置和未设置的位数。
  • 将所有设置的位向左移动(MSB),将所有未设置的位向右移动(LSB),以最大化阵列元素。
  • 如果设置位或未设置位的数量等于数组元素的位数,则该元素不能更改(例如(7) 10 =(111) 2
  • 打印数组中最大化的元素

下面是上述方法的实现:

C++
// C++ implementation to
// find maximum sequence by
// swapping bits
#include 
using namespace std;
  
// Function to generate the maximized
// array elements
void maximizedArray(
    int arr[], int N)
{
    int num, i = 0;
  
    // Traverse the array
    while (N--) {
        num = arr[i];
        int one = 0;
        int zero = 0;
  
        // Iterate to count set and
        // unset bits
        while (num) {
  
            // Count of unset bits
            if (num % 2 == 0) {
                zero++;
            }
            else {
  
                // Count of set bits
                one++;
            }
  
            // Bitwise right shift
            num = num >> 1;
        }
  
        for (int j = zero; j < (one + zero);
             j++) {
  
            // Shifting all 1's to MSB
            // and 0's to LSB
            num += (1 << j);
        }
        cout << num;
        i++;
  
        if (N > 0)
            cout << ", ";
    }
}
  
// Driver Code
int main()
{
  
    int arr[] = { 8, 15, 9, 10, 14 };
    int N = sizeof(arr) / sizeof(arr[0]);
  
    maximizedArray(
        arr, N);
  
    return 0;
}


Java
// Java implementation to find
// maximum sequence by swapping bits
class GFG{
  
// Function to generate the maximized
// array elements
public static void maximizedArray(int arr[],
                                  int N)
{
    int num, i = 0;
  
    // Traverse the array
    for(int l = N; l > 0; l--)
    {
       num = arr[i];
       int one = 0;
       int zero = 0;
         
       // Iterate to count set and
       // unset bits
       while (num != 0)
       {
             
           // Count of unset bits
           if (num % 2 == 0)
           {
               zero++;
           }
           else
           {
                 
               // Count of set bits
               one++;
           }
             
           // Bitwise right shift
           num = num >> 1;
       }
         
       for(int j = zero; j < (one + zero); j++)
       {
             
          // Shifting all 1's to MSB
          // and 0's to LSB
          num += (1 << j);
       }
       System.out.print(num);
       i++;
         
       if (N > 0)
           System.out.print(", ");
    }
}
  
// Driver Code
public static void main(String args[])
{
    int arr[] = { 8, 15, 9, 10, 14 };
    int N = arr.length;
  
    maximizedArray(arr, N);
}
}
  
// This code is contributed by SoumikMondal


Python3
# Python3 implementation to find 
# maximum sequence by swapping bits
  
# Function to generate the maximized
# array elements
def maximizedArray(arr, N):
      
    i = 0
      
    # Traverse the array
    while (N > 0):
        num = arr[i]
        one = 0
        zero = 0
          
        # Iterate to count set and
        # unset bits
        while (num):
              
            # Count of unset bits
            if (num % 2 == 0):
                zero += 1
      
            else:
  
                # Count of set bits
                one += 1
                  
            # Bitwise right shift
            num = num >> 1
              
        for j in range(zero, (one + zero)):
              
            # Shifting all 1's to MSB
            # and 0's to LSB
            num += (1 << j)
              
        print(num, end = "")
        i += 1
          
        if (N > 0):
            print(", ", end = "")
              
        N -= 1
          
# Driver Code
if __name__ == "__main__":
  
    arr = [ 8, 15, 9, 10, 14 ]
    N = len(arr)
  
    maximizedArray(arr, N)
  
# This code is contributed by chitranayal


C#
// C# implementation to find
// maximum sequence by swapping bits
using System;
class GFG{
  
// Function to generate the maximized
// array elements
public static void maximizedArray(int []arr,
                                  int N)
{
    int num, i = 0;
  
    // Traverse the array
    for(int l = N; l > 0; l--)
    {
        num = arr[i];
        int one = 0;
        int zero = 0;
              
        // Iterate to count set and
        // unset bits
        while (num != 0)
        {
                  
            // Count of unset bits
            if (num % 2 == 0)
            {
                zero++;
            }
            else
            {
                      
                // Count of set bits
                one++;
            }
                  
            // Bitwise right shift
            num = num >> 1;
        }
              
        for(int j = zero; j < (one + zero); j++)
        {
                  
            // Shifting all 1's to MSB
            // and 0's to LSB
            num += (1 << j);
        }
        Console.Write(num);
        i++;
              
        if (N > 0)
            Console.Write(", ");
    }
}
  
// Driver Code
public static void Main(String []args)
{
    int []arr = { 8, 15, 9, 10, 14 };
    int N = arr.Length;
  
    maximizedArray(arr, N);
}
}
  
// This code is contributed by sapnasingh4991


输出:
8, 15, 12, 12, 14

时间复杂度: O(Nlog 2 N)
辅助空间: O(1)