zoukankan      html  css  js  c++  java
  • binary code(二进制串的问题)

    题目

    给定一个N位的二进制串
      b1  b2  … bN-1  bN 
    将该串做旋转,即将b1移到bN后面,得到一个新的二进制串:
      b2  … bN-1  bN  b1
    对新的二进制串再做旋转,得二进制串
      b3  b4  … bN-1  bNb1  b2 
    重复旋转操作操作,可得N个二进制串,对这N个串排序,可得一个N*N的矩阵
    例如: 
      1  0  0  0  1 ->
      0  0  0  1  1 ->
      1  1  0  0  0 ->
      0  0  1  1  0 ->
      0  1  1  0  0
    对它们做排序,得矩阵
    0   0   0   1   1
    0   0   1   1   0 
    0   1   1   0   0
    1   0   0   0   1  
    1   1   0   0   0
    
    问:给定这种矩阵的最后一列,求出矩阵的第一行。
    对于上面的例子,给出 1 0 0 1 0,要你的程序输出 0 0 0 1 1。
    

    代码

     1 #include <stdio.h>
     2 
     3 #define NMAX 100
     4 
     5 int main(){
     6   int i, j, none, total;
     7   char input[NMAX], one[NMAX], *p;
     8   int next[NMAX];
     9   j = total = none = 0;
    10 
    11   printf("Please input your sequence of [01]: ");
    12   scanf("%s", &input);
    13   p = input;
    14   while(*p){
    15     if(*p == '0')
    16       next[j++] = total;
    17     else if(*p == '1')
    18       one[none++] = total;
    19     total++;
    20     p++;
    21   }
    22 
    23   for(i = 0; i < none; i++)
    24     next[j++] = one[i];
    25 
    26   printf("\nHere is your input: \n%s\n", input);
    27   
    28   printf("\nHere is the first line:\n");
    29   for(i = j = 0; i < total; i++)
    30     printf("%c",input[j = next[j]]);
    31   printf("\n");
    32 
    33   return 0; 
    34 }
    算法描述:
    1.计算输入列中0和1的个数,并用它们形成第一列.
    2.生成一个Next数组,使得数组中的i个0指向最后一列第i个0的行数,数组中的第j个1指向最后一列第j个1的行数.
    3.从第1行开始,按照Next指引的顺序 – 从k到Next[k], 每次把该行最后一列的数字取出生成第一行的相应数字。
    
    例如  输入 10010
    1. 有3个0,2个1,所以第1列一定是
      0
      0
      0
      1
      1
    2. 生成Next数组			          Next
       1		0		1		2
       2		0		0		3
       3		0		0		5
       4		1		1		1
       5		1		0		4
    3. 沿着Next,根据 输入列,生成第一行
       0  0  0  1  1
    
    原理:
    对于序列(1) b1  b2  … bN-1  bN,左旋一位变成(2) b2  … bN-1  bN  b1 ,我们只要知道(1)左旋后得到的(2)在矩阵中是哪一行,就可以根据该行第一列的值得到 b2,依次类推得到b3 , b4 , …
    即:
    假设矩阵中两行都以0开始,则它们左旋后,前后次序不变,所以在矩阵中以0开始的第1行,它的左旋后的序列在最后一列的第一个0的行。对1开始的行有同样的性质。
    

  • 相关阅读:
    (转)flash的Socket通讯沙箱和安全策略问题
    as3 页游中,新手指导中,屏蔽所有交互对象,但除了指定交互对象可用的方法【转http://blog.csdn.net/linjf520/article/details/9450945】
    位运算 (&|)与--或 一位数组表示多种意思~~ 与--或
    SQL语句
    stage.width/height和stage.stageWidth/stageHeight的区别
    解决Mac OS Adobe Flash Builder 4.7 java heap space 问题【转】
    一个loader加载多个swf
    加濾鏡效果GlowTween
    [AS3]as3用ByteArray来对SWF文件编码加密实例参考
    屏幕震动效果
  • 原文地址:https://www.cnblogs.com/beanmoon/p/2776322.html
Copyright © 2011-2022 走看看