翻转C中的位

时间:2014-09-26 22:17:10

标签: c arrays

最近在接受采访时,我被问到以下问题,我无法正确回答。有人可以让我知道答案到底是什么 题: 给你一个大小为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

3 个答案:

答案 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编写它,因为:

  1. 这是一个算法问题,特定于语言的细节相对不重要。
  2. Python有一个非常好的bitstring module来处理任意长度的位串。
  3. 我不想完全为他做OP的作业。
  4. 此算法为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);