logo

Підрахуйте мінімальну кількість бітів, щоб перевернути так, щоб XOR для A і B дорівнював C

Дано послідовність з трьох двійкових послідовностей A B і C з N бітів. Підрахуйте мінімальну кількість бітів, необхідних для перетворення A і B, щоб XOR A і B дорівнював C. Для приклад:  
 

Input: N = 3 A = 110 B = 101 C = 001 Output: 1 We only need to flip the bit of 2nd position of either A or B such that A ^ B = C i.e. 100 ^ 101 = 001


 

ціле число в рядок java


А Наївний підхід полягає в тому, щоб згенерувати всі можливі комбінації бітів в A і B, а потім виконати їх XOR, щоб перевірити, чи дорівнює він C чи ні. Часова складність цього підходу зростає експоненціально, тому він не буде кращим для великого значення N.
інший підхід полягає у використанні концепції XOR. 
 



XOR Truth Table   Input     Output   X Y Z 0 0 - 0 0 1 - 1 1 0 - 1 1 1 - 0


Якщо ми узагальнимо, то виявимо, що в будь-якій позиції A і B нам потрібно лише перевернути iтис(від 0 до N-1) положення A або B, інакше ми не зможемо досягти мінімальної кількості бітів. 
Отже, у будь-якій позиції i (від 0 до N-1) ви зіткнетеся з двома типами ситуацій, тобто A[i] == B[i] або A[i] != B[i]. Давайте обговоримо це по черзі. 
 


  • Якщо A[i] == B[i], тоді XOR цих бітів буде 0. У C[] виникають два випадки: C[i]==0 або C[i]==1. 
    Якщо C[i] == 0, то не потрібно перевертати біт, але якщо C[i] == 1, тоді ми повинні перевернути біт або в A[i], або в B[i], щоб 1^0 == 1 або 0^1 == 1. 
     

  • Якщо A[i] != B[i], то XOR цих бітів дає 1. У C знову виникають два випадки, тобто або C[i] == 0, або C[i] == 1. 
    Тому, якщо C[i] == 1, нам не потрібно перевертати біт, але якщо C[i] == 0, тоді нам потрібно перевертати біт або в A[i], або в B[i], щоб 0^0==0 або 1^1==0 
     


 

C++
// C++ code to count the Minimum bits in A and B #include   using namespace std; int totalFlips(char *A char *B char *C int N) {  int count = 0;  for (int i=0; i < N; ++i)  {  // If both A[i] and B[i] are equal  if (A[i] == B[i] && C[i] == '1')  ++count;  // If Both A and B are unequal  else if (A[i] != B[i] && C[i] == '0')  ++count;  }  return count; } //Driver Code int main() {  //N represent total count of Bits  int N = 5;  char a[] = '10100';  char b[] = '00010';  char c[] = '10011';  cout << totalFlips(a b c N);  return 0; } 
Java
// Java code to count the Minimum bits in A and B class GFG {    static int totalFlips(String A String B  String C int N)  {  int count = 0;    for (int i = 0; i < N; ++i)  {  // If both A[i] and B[i] are equal  if (A.charAt(i) == B.charAt(i) &&   C.charAt(i) == '1')  ++count;    // If Both A and B are unequal  else if (A.charAt(i) != B.charAt(i)  && C.charAt(i) == '0')  ++count;  }    return count;  }    //driver code  public static void main (String[] args)  {  //N represent total count of Bits  int N = 5;  String a = '10100';  String b = '00010';  String c = '10011';    System.out.print(totalFlips(a b c N));  } } // This code is contributed by Anant Agarwal. 
Python3
# Python code to find minimum bits to be flip def totalFlips(A B C N): count = 0 for i in range(N): # If both A[i] and B[i] are equal if A[i] == B[i] and C[i] == '1': count=count+1 # if A[i] and B[i] are unequal else if A[i] != B[i] and C[i] == '0': count=count+1 return count # Driver Code # N represent total count of Bits N = 5 a = '10100' b = '00010' c = '10011' print(totalFlips(a b c N)) 
C#
// C# code to count the Minimum // bits flip in A and B using System; class GFG {  static int totalFlips(string A string B  string C int N)  {  int count = 0;  for (int i = 0; i < N; ++i) {  // If both A[i] and B[i] are equal  if (A[i] == B[i] && C[i] == '1')  ++count;  // If Both A and B are unequal  else if (A[i] != B[i] && C[i] == '0')  ++count;  }  return count;  }  // Driver code  public static void Main()  {  // N represent total count of Bits  int N = 5;  string a = '10100';  string b = '00010';  string c = '10011';  Console.Write(totalFlips(a b c N));  } } // This code is contributed by Anant Agarwal. 
PHP
 // PHP code to count the // Minimum bits in A and B function totalFlips($A $B $C $N) { $count = 0; for ($i = 0; $i < $N; ++$i) { // If both A[i] and  // B[i] are equal if ($A[$i] == $B[$i] && $C[$i] == '1') ++$count; // If Both A and  // B are unequal else if ($A[$i] != $B[$i] && $C[$i] == '0') ++$count; } return $count; } // Driver Code // N represent total count of Bits $N = 5; $a = '10100'; $b = '00010'; $c = '10011'; echo totalFlips($a $b $c $N); // This code is contributed by nitin mittal. ?> 
JavaScript
<script> // Javascript code to count the Minimum bits in A and B   function totalFlips(A B C N)   {   let count = 0;   for (let i = 0; i < N; ++i) {     // If both A[i] and B[i] are equal   if (A[i] == B[i] && C[i] == '1')   ++count;     // If Both A and B are unequal   else if (A[i] != B[i] && C[i] == '0')   ++count;   }   return count;   }    // Driver Code    // N represent total count of Bits   let N = 5;   let a = '10100';   let b = '00010';   let c = '10011';     document.write(totalFlips(a b c N));    </script> 

Вихід
2


Часова складність: O(N) 
Допоміжні приміщення: О(1)

Ефективний підхід:

чайна проти столової ложки

Цей підхід відповідає часовій складності O(log N).

C++
// C++ code to count the Minimum bits in A and B #include    using namespace std; int totalFlips(string A string B string C int N) {  int INTSIZE = 31;  int ans = 0;  int i = 0;  while (N > 0) {  // Considering only 31 bits  int a = stoi(A.substr(i * INTSIZE min(INTSIZE N))  0 2);  int b = stoi(B.substr(i * INTSIZE min(INTSIZE N))  0 2);  int c = stoi(C.substr(i * INTSIZE min(INTSIZE N))  0 2);  int Z = a ^ b ^ c;  // builtin function for  // counting the number of set bits.  ans += __builtin_popcount(Z);  i++;  N -= 32;  }  return ans; } // Driver Code int main() {  // N represent total count of Bits  int N = 5;  char a[] = '10100';  char b[] = '00010';  char c[] = '10011';  cout << totalFlips(a b c N);  return 0; } // This code is contributed by Kasina Dheeraj. 
Java
// Java code to count the Minimum bits in A and B class GFG {  static int totalFlips(String A String B String C  int N)  {  int INTSIZE = 31;  int ans = 0;  int i = 0;  while (N > 0) {  // Considering only 31 bits  int a = Integer.parseInt(  A.substring(i * INTSIZE  i * INTSIZE  + Math.min(INTSIZE N))  2);  int b = Integer.parseInt(  B.substring(i * INTSIZE  i * INTSIZE  + Math.min(INTSIZE N))  2);  int c = Integer.parseInt(  C.substring(i * INTSIZE  i * INTSIZE  + Math.min(INTSIZE N))  2);  int Z = a ^ b ^ c;  // builtin function for  // counting the number of set bits.  ans += Integer.bitCount(Z);  i++;  N -= 32;  }  return ans;  }  // driver code  public static void main(String[] args)  {  // N represent total count of Bits  int N = 5;  String a = '10100';  String b = '00010';  String c = '10011';  System.out.print(totalFlips(a b c N));  } } // This code is contributed by Kasina Dheeraj. 
Python3
def totalFlips(A B C N): INTSIZE = 31 ans = 0 i = 0 while N > 0: # Considering only 31 bits a = int(A[i * INTSIZE: min(INTSIZE + i * INTSIZE N)] 2) b = int(B[i * INTSIZE: min(INTSIZE + i * INTSIZE N)] 2) c = int(C[i * INTSIZE: min(INTSIZE + i * INTSIZE N)] 2) Z = a ^ b ^ c # builtin function for counting the number of set bits. ans += bin(Z).count('1') i += 1 N -= 32 return ans # Driver Code if __name__ == '__main__': # N represent total count of Bits N = 5 a = '10100' b = '00010' c = '10011' print(totalFlips(a b c N)) 
C#
using System; class Program {  static int TotalFlips(string A string B string C  int N)  {  int INTSIZE = 31;  int ans = 0;  int i = 0;  while (N > 0) {  // Considering only 31 bits  int a = Convert.ToInt32(  A.Substring(i * INTSIZE  Math.Min(INTSIZE N))  2);  int b = Convert.ToInt32(  B.Substring(i * INTSIZE  Math.Min(INTSIZE N))  2);  int c = Convert.ToInt32(  C.Substring(i * INTSIZE  Math.Min(INTSIZE N))  2);  int Z = a ^ b ^ c;  // builtin function for  // counting the number of set bits.  ans += BitCount(Z);  i++;  N -= 32;  }  return ans;  }  static int BitCount(int i)  {  i = i - ((i >> 1) & 0x55555555);  i = (i & 0x33333333) + ((i >> 2) & 0x33333333);  return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101)  >> 24;  }  static void Main(string[] args)  {  // N represent total count of Bits  int N = 5;  string a = '10100';  string b = '00010';  string c = '10011';  Console.WriteLine(TotalFlips(a b c N));  } } 
JavaScript
function TotalFlips(A B C N) {  let INTSIZE = 31;  let ans = 0;  let i = 0;  while (N > 0)  {  // Considering only 31 bits  let a = parseInt(A.substring(i * INTSIZE Math.min(INTSIZE + i * INTSIZE N)) 2);  let b = parseInt(B.substring(i * INTSIZE Math.min(INTSIZE + i * INTSIZE N)) 2);  let c = parseInt(C.substring(i * INTSIZE Math.min(INTSIZE + i * INTSIZE N)) 2);  let Z = a ^ b ^ c;  // builtin function for  // counting the number of set bits.  ans += Z.toString(2).split('1').length - 1;  i++;  N -= 32;  }  return ans; } // Driver Code let N = 5; let a = '10100'; let b = '00010'; let c = '10011'; console.log(TotalFlips(a b c N)); 

Вихід
2

Чому цей код працює?

Ми спостерігаємо, що біт має бути перевернутий, якщо A[i]^B[i] !=C[i]. Отже, ми можемо отримати кількість перевертань, обчисливши кількість встановлених бітів у a^b^c, де abc — ціле представлення двійкового рядка. Але довжина рядка може перевищувати 32 розміру типового типу int. Отже, план полягає в тому, щоб розділити рядок на підрядки довжиною 31, виконати операції та підрахувати встановлені біти, як зазначено для кожного підрядка.

форматувати дату в рядок

Часова складність: O(log N) оскільки цикл while виконується для журналу31N разів і підрахунок встановлених бітів становить щонайбільше O(32) для 32-бітних і O(64) для 64-бітних і для кожної операції підрядка O(31).

Космічна складність: О(1) слід зазначити, що операція з підрядком вимагає O(32) простору.

 
'
 

Створіть вікторину