最近在接受采访时,我被问到以下问题,我无法正确回答。有人可以让我知道答案到底是什么 题: 给你一个大小为N的数组。数组的元素是d [0],d [1] ... d [N-1]其中每个d [i]是0或1.你最多可以执行在数组上移动一个:选择任意两个整数[L,R]并翻转第(L)和第R位之间的所有元素(包括)。 L和R表示标记您决定翻转的段边界的位的最左侧和最右侧索引。
如果在最终位串中可以获得1位(由S表示),那么最大数量是多少? '翻转'有点意味着,0转换为1,1转换为0。
示例输入 8 10010010
示例输出 6
答案 0 :(得分:2)
这个怎么样?我假设[L,R]的定义是包含的,所以如果L = 5且R = 2,你想要翻转2-5位,包括在内。
基本上,你构造一个在要翻转的位置有1的面具,然后用原始整数进行异或。
int d = 0xdeadbeef; /* 0b11011110101011011011111011101111 */
int l = 5;
int r = 2;
int mask = 0;
for (int ii=r; ii<=l; i++) {
mask |= 1<<ii;
}
printf("Original: %x", d);
printf("Bits %d-%d flipped: %x", r, l, d^mask) /* 0b11011110101011011011111011010011 */
答案 1 :(得分:0)
以下是OP修订问题的完整解决方案:我用Python 2.7而不是C编写它,因为:
bitstring
module来处理任意长度的位串。此算法为O(N^2)
:这是我在my comment above中建议的蛮力方法。它只是查看原始字符串的所有子字符串,并找到具有最大不平衡0和1(最大N_0 - N_1)的字符串。它使用间隔[L,R)
的半开放定义,因为这是使用Python的切片语法的最自然的符号。
import bitstring
def maximize_ones(s):
best = lbest = rbest = 0
for ledge in range(0,len(s)-1):
for redge in range(ledge+1,len(s)):
if redge-ledge<=best:
continue
value = s[ledge:redge].count(0)-s[ledge:redge].count(1)
if value>best:
best = value
lbest = ledge
rbest = redge
# Uncomment to show intermediate best-so-far solutions
# print "Flipping bits [%d,%d) will add %d additional 1s" % (lbest, rbest, best)
return best, lbest, rbest
s = bitstring.Bits(bin=raw_input("Bit string:"))
d = len(s)
best, lbest, rbest = maximize_ones(s)
best_mask = bitstring.Bits(bin=('0'*lbest)+('1'*(rbest-lbest))+('0'*(len(s)-rbest)))
print "Flipping bits [%d,%d) will add %d additional 1s" % (lbest, rbest, best)
print " s_orig = %s (contains %d ones)" % (s.bin, s.count(1))
print " s_flip = %s (contains %d ones)" % ((s^best_mask).bin, (s^best_mask).count(1))
示例输出:
$ python maximize_ones.py
Bit string:101100101001000010100010
Flipping bits [4,22) will add 8 additional 1s
s_orig = 101100101001000010100010 (contains 9 ones)
s_flip = 101111010110111101011110 (contains 17 ones)
答案 2 :(得分:0)
I did it C Language:
int elementsCount = 0;
printf("Specify number of elements in arry:\n");
scanf("%d",&elementsCount);
int arrayValue [elementsCount];
printf("Enter elementsCount numbers:\n");
for(int i=0;i<elementsCount;++i)
{
scanf("%d",&arrayValue[i]);
}
printf("Given Elements of Array are :\n");
for(int j=0;j<elementsCount;++j)
{
printf("%d",arrayValue[j]);
}
printf("\n");
int lValue,rValue;
int count = sizeof(arrayValue)/sizeof(arrayValue[0]);
int onesCount = 0;
printf("Specify LeftIndex Range :\n");
scanf("%d",&lValue);
printf("Specify LeftIndex Range :\n");
scanf("%d", &rValue);
for (int i=0;i<count;i++)
{
if (i >=lValue && i<=rValue)
{
int flipValue = arrayValue[i];
if (flipValue == 0)
{
arrayValue[i] = 1;
}
else if(flipValue == 1)
{
arrayValue[i] = 0;
}
}
}
for (int k =0;k<count; k++)
{
printf("%d",arrayValue[k]);
if (arrayValue[k] == 1)
{
onesCount = onesCount + 1;
}
}
printf("\n");
printf("Total Number of 1's are: %d\n",onesCount);