Givet en sekvens av tre binära sekvenser A B och C med N bitar. Räkna de minsta bitar som krävs för att vända in A och B så att XOR för A och B är lika med C. För Exempel:
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
A Naivt förhållningssätt är att generera alla möjliga kombinationer av bitar i A och B och sedan XORing dem för att kontrollera om det är lika med C eller inte. Tidskomplexitet av detta tillvägagångssätt växer exponentiellt så det skulle inte vara bättre för ett stort värde på N.
En annan tillvägagångssätt är att använda konceptet XOR.
XOR Truth Table Input Output X Y Z 0 0 - 0 0 1 - 1 1 0 - 1 1 1 - 0
Om vi generaliserar kommer vi att upptäcka att vid vilken position som helst av A och B behöver vi bara vända ith(0 till N-1) position för antingen A eller B, annars kommer vi inte att kunna uppnå minsta antal bitar.
Så vid vilken position som helst av i (0 till N-1) kommer du att stöta på två typer av situationer, dvs antingen A[i] == B[i] eller A[i] != B[i]. Låt oss diskutera det en efter en.
-
Om A[i] == B[i] så kommer XOR av dessa bitar att vara 0 två fall uppstår i C[]: C[i]==0 eller C[i]==1.
Om C[i] == 0 behöver vi inte vända biten men om C[i] == 1 måste vi vända biten antingen i A[i] eller B[i] så att 1^0 == 1 eller 0^1 == 1.
-
Om A[i] != B[i] så ger XOR av dessa bitar en 1 I C uppstår två fall igen, dvs antingen C[i] == 0 eller C[i] == 1.
Om C[i] == 1 behöver vi därför inte vända biten utan om C[i] == 0 måste vi vända biten antingen i A[i] eller B[i] så att 0^0==0 eller 1^1==0
// 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>
Produktion
2
Tidskomplexitet: PÅ)
Extra utrymme: O(1)
Effektivt tillvägagångssätt:
Detta tillvägagångssätt följer O(log N) tidskomplexitet.
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));
Produktion
2
Varför fungerar den här koden?
Vi observerar att biten måste vändas om A[i]^B[i] !=C[i]. Så vi kan få antalet vändningar genom att beräkna antalet setbitar i a^b^c där abc är heltalsrepresentationer av binär sträng. Men stränglängden kan vara större än 32 storlek av en typisk int-typ. Så planen är att dela upp strängen i delsträngar med längd 31, utföra operationer och räkna setbitar som nämnts för varje delsträng.
Tidskomplexitet: O(log N) eftersom while-slingan körs för logg31N gånger och räkneuppsättningsbitar står för högst O(32) för 32-bitar och O(64) för 64-bitar och för varje delsträngsoperation O(31).
Utrymmes komplexitet: O(1) att notera att delsträngsoperation behöver O(32) utrymme.
'