×

Loading...
Ad by
  • 最优利率和cashback可以申请特批,好信用好收入offer更好。请点链接扫码加微信咨询,Scotiabank -- Nick Zhang 6478812600。
Ad by
  • 最优利率和cashback可以申请特批,好信用好收入offer更好。请点链接扫码加微信咨询,Scotiabank -- Nick Zhang 6478812600。

help: C语言算法的题目-数组变换.

输入的是一个类型为整数的数组,长度固定为N,设该数组为A[N];

关于数组A 里的元素的初始值是这样的: 要么A[i]=-1 ,要么A[i]=i;
如果A[i] 为-1 ,那它需要旋转变换,改变其值.

例1: N 为6 输入数组A的值为{-1,-1,-1,-1,-1,-1} ,那么进行旋转变换后的数组A的值为{5,0,1,2,3,4};

例2: N 为6 输入 数组A的值为{-1,-1,2,3,-1,-1} ,那么进行旋转变换后的数组A的值为{5,0,2,3,1,4};

例3: N 为6 输入数组A的值为{-1,1,2,-1,-1,-1} ,那么进行旋转变换后的数组A的值为{5,1,2,0,3,4};

例4: N 为6 输入数组A的值为{0,-1,2,-1,-1,-1} ,那么进行旋转变换后的数组A的值为{0,5,2,1,3,4};

我没想到参加工作以后,还会碰到写这种的程序,脑袋不好用,一时没想出来该怎么写.
Report

Replies, comments and Discussions:

  • 工作学习 / IT技术讨论 / help: C语言算法的题目-数组变换.
    输入的是一个类型为整数的数组,长度固定为N,设该数组为A[N];

    关于数组A 里的元素的初始值是这样的: 要么A[i]=-1 ,要么A[i]=i;
    如果A[i] 为-1 ,那它需要旋转变换,改变其值.

    例1: N 为6 输入数组A的值为{-1,-1,-1,-1,-1,-1} ,那么进行旋转变换后的数组A的值为{5,0,1,2,3,4};

    例2: N 为6 输入 数组A的值为{-1,-1,2,3,-1,-1} ,那么进行旋转变换后的数组A的值为{5,0,2,3,1,4};

    例3: N 为6 输入数组A的值为{-1,1,2,-1,-1,-1} ,那么进行旋转变换后的数组A的值为{5,1,2,0,3,4};

    例4: N 为6 输入数组A的值为{0,-1,2,-1,-1,-1} ,那么进行旋转变换后的数组A的值为{0,5,2,1,3,4};

    我没想到参加工作以后,还会碰到写这种的程序,脑袋不好用,一时没想出来该怎么写.
    • 1) 求补向量, (if(A[i]==i) a[i]=-1) else(a[i]=i); 2) 循环右移一位;得向量B; 2) 顺次以B的有效值补A的无效值;
      • 估计大家很难理解题目的意思.
        在这个项目是要在屏幕上显示数据库某张表的N 条记录,每一次显示的次序都不一样.当前显示的次序,是其上一次显示次序的向前移动移动一位的结果,也就是说原来的第一个变到最后一个,第二个变为第一个,以此类推.但是在记录里有个标志位,当这个标志位是TRUE 时,它在屏幕上显示的次序是不会被改变的
        • 看你的例子,怎么和你的说明不一致啊。不是向左循环移位,应该是向右循环移位吧。
          • 例子是向左的.
            • 例1: N 为6 输入数组A的值为{-1,-1,-1,-1,-1,-1} ,那么进行旋转变换后的数组A的值为{5,0,1,2,3,4};
              向左么!看了半天,还是向右啊。
              • {5,0,1,2,3,4} :第一个元素为5 表示要排到最后一个,第二个元素为0,表示要排到第一个,.... 所以是向左.
    • 解决了.源程序
      void Rotate(int A[])
      {
      Int16 value;
      Int16 i,j;
      Boolean find;

      if(A[0]==-1) A[0]=N-1;

      for(value=0;value<N;value++)
      {
      find=false;
      for(j=0;j<N;j++)
      if(A[j]==value)
      {
      find=true;
      break;
      }
      if(!find)
      for(j=0;j<N:j++)
      if(A[j]==-1)
      {
      A[j]=value;
      break;
      }

      }

      }
      • 效率太低了。 重写! :D
        • 简化算法
          void Rotate(int A[])
          {
          Int16 value,end;
          Int16 i;

          for(i=N-1,i<=0;i--) {
          if A[i]==-1 break;
          }

          if i<=0 return;

          value=i;end=i+1;

          for(i=0;i<end;i++) {
          if A[i]== -1 {
          A[i]=value;
          value=i;
          }
          }
          }
          • 不错.