在这个问题中,我们得到了二进制字符串大小为n的数组bin []。我们的任务是创建一个程序,以查找N个二进制字符串的按位与(&)。
在这里,我们将取所有数字并找到它们的按位与,即bin [0]&bin [1]&... bin [n-2]&bin [n]
让我们举个例子来了解这个问题,
输入-
bin[] = {"1001","11001","010101"}
输出-
000001
说明-所有二进制字符串的按位与-
(1001) & (11001) & (010101) = 000001
为了解决此问题,一种直接而简单的方法是找到两个二进制字符串的按位与,然后与下一个找到结果的按位与,并继续到数组的最后一个字符串。
基本算法将是-
最初→result= bin [0],而i = 1
步骤1-重复步骤2和3,直到数组结束。
步骤2-result=result&bin [i]
步骤3 -i ++;
步骤4-打印result。
现在,让我们借助这种方法来解决示例-
bin[] = {“1001”, “11001”, “010101”} result = bin[0] = 1001, i = 1
迭代1 -
result = 1001 & 11001 = 01001 i = 2
迭代2 -
result = 01001 & 010101 = 000001 i = 3. END
用于说明上述解决方案的程序,
#include <iostream> using namespace std; int changeLength(string &a, string &b){ int lengtha = a.length(); int lengthb = b.length(); int zeros = abs(lengtha-lengthb); if (lengtha<lengthb) { for (int i = 0 ; i<zeros; i++) a = '0' + a; return lengthb; } else { for (int i = 0 ; i<zeros; i++) b = '0' + b; } return lengtha; } string bitwiseAND(string binary1, string binary2){ int length = changeLength(binary1,binary2); string result = ""; for (int i = 0 ; i<length; i++){ result = result+(char)((binary1[i] - '0' & binary2[i]-'0')+'0'); } return result; } int main(){ string bin[] = {"1001", "11001", "010101"}; int n = sizeof(bin)/sizeof(bin[0]); string result; if (n<2){ cout<<bin[n-1]<<endl; } else{ result = bin[0]; for (int i = 1; i<n; i++) result = bitwiseAND(result, bin[i]); cout <<result<<endl; } }
输出结果
000001
这种方法很简单,但不是最有效的方法,因为它需要遍历字符串。
让我们讨论一个更有效的解决方案,
在这里,我们将找到二进制数最小和最大位的大小。然后,我们将找到数字的每一位的按位与,并在最后添加前面的0(零个数将是最大的-最小的)。
让我们以一个示例为例,使解决方案清晰明了,
bin[] = {"1001", "11001", "010101"} Largest = 010101 smallest = 1001 010101 & 1001 = 00001
展示上述方法的实施方案-
#include <bits/stdc++.h> using namespace std; string bitwiseANDarray(string* bin, int n){ string result; int minSize = INT_MAX; int maxSize = INT_MIN; for (int i = 0; i < n; i++) { reverse(bin[i].begin(), bin[i].end()); minSize = min(minSize, (int)bin[i].size()); maxSize = max(maxSize, (int)bin[i].size()); } for (int i = 0; i < minSize; i++) { bool setBit = true; for (int j = 0; j < n; j++) { if (bin[j][i] == '0') { setBit = false; break; } } result += (setBit ? '1' : '0'); } for (int i = 0; i<abs(maxSize-minSize); i++) result += '0'; reverse(result.begin(), result.end()); return result; } int main(){ string arr[] = {"1001", "11001", "010101"}; int n = sizeof(arr) / sizeof(arr[0]); cout<<bitwiseANDarray(arr, n); return 0; }
输出结果
000001