现在有数组数据如下0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,77,77,81,81,72,72,72,72,72,72,72,72,72,72,72,72,77,77,77,77,77,72,72,72,60,55,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0要求,找到其中有连续出现次数<=n次的几个数字,并将其置为0
当n=5时,处理后结果如下
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,77,77,81,81,72,72,72,72,72,72,72,72,72,72,72,72,77,77,77,77,77,72,72,72,60,55,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0不知道大家看明白没有。
这实际上是对一维数组进行低频滤波的问题,不知道有没有什么好的的算法
这个有点麻烦谢谢大家了

解决方案 »

  1.   

    先分割,后判断每个数的次数,<=n的置为0,如何呢?我也不是高手,我也要进。问题态度真差劲。
      

  2.   


    var
      {这里用的是Integer数组,如果是其他长度的整型,直接更换声明,算法中不必改动}
      A : array[0..17] of Integer = (1,2,2,2,2,2,7,7,4,4,4,4,4,4,4,3,3,3);procedure TForm1.Button1Click(Sender: TObject);
    const
      C = 4;
    var
      I, J, K, P, L: Integer;
    begin
      L := SizeOf(A[Low(A)]);{计算每个元素的长度}
      J := 1;
      P := Low(A);
      K := A[P];
      for I := Low(A) to High(A) do begin
        if A[I] <> K then begin
          if J <= C then FillChar(A[P], (I-P)*L, 0);
          J:=1; P:=I; K:=A[I];
        end else Inc(J);
      end;
      if (J <= C) then FillChar(A[P], (High(A)+1-P)*L, 0);
    end;
      

  3.   

    把4楼代码改了一下:
    type
      {这里用的是Integer数组,如果是其他长度的整型,直接更换声明,算法中不必改动}
      TArr = array[0..20] of Integer;var
      Arr : TArr = (1,2,2,2,2,2,2,7,4,4,4,4,4,6,6,3,3,3,3,3,3);procedure dododo(var A: TArr; n: Integer);
    var
      I, J, K, P, L: Integer;
    begin
      L := SizeOf(A[Low(A)]);{计算每个元素的长度}
      J := 1;
      P := Low(A);
      K := A[P];
      for I := Low(A) to High(A) do
        if A[I] <> K then begin
          if J <= n then FillChar(A[P], (I-P)*L, 0);
          J:=1; P:=I; K:=A[I];
        end else Inc(J);
      if (J <= n) then FillChar(A[P], (High(A)+1-P)*L, 0);
    end;{--------以下是测试---------------------------}
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
    begin  dododo(Arr, 5);  Memo1.Clear;
      for I := Low(Arr) to High(Arr) do
        Memo1.Lines.Add(InttoStr(Arr[I]));
    end;
      

  4.   

     不好意思,忘记加了个条件,
    应该是 如果 连续n个数>0,如果出现次数<n的 则将这几个数置为0
    当n=4时
    这样的不用处理1,2,2,2,2,2,2,7,4,4,4,4,4,6,6,3,3,3,3,3,3数据          1,2,2,2,2,2,0,7,4,0,4,4,4,6,6,3,3,3,3,3,3
    处理结果      1,2,2,2,2,2,0,0,0,0,4,4,4,6,6,3,3,3,3,3,3数据          1,0,2,2,2,0,0,0,0,4,4,4,4,6,6,3,0,3,0,3,3
    处理结果      0,0,0,0,0,0,0,0,0,4,4,4,4,6,6,3,0,0,0,0,0
    不知道能看明白吗。
    我实际上是想处理这个波形将那些不连续的毛刺去掉,处理后结果如下
      

  5.   

    lihuasoft哥的已经很接近了,只是我对fillchar的用法不熟悉,所以还不知道如何修改下
      

  6.   

    看图能看明白吗,那是一个数组的波形。将面积小的白色部分去除,也就是将连续次数小于n次的大于0的数置为0。比如n=4
    00020      -->00000
    00220      -->00000
    02220      -->00000
    02022      -->00000
    22022      -->00000
    20222      -->00000
    22220      -->22220   不处理
    02222      -->02222   不处理
    22222      -->22222   不处理
      

  7.   

    还是看不懂你的意思.22220 -->22220 不处理22220 连续出现次数也没有超过n, 为什么就不处理?
    你总该拿出一个不矛盾的描述,我才能给你写算法吧
      

  8.   

    n=4的时候22220 =4 不是说<4的吗,不是<=4 所以不处理  
    如果n=5就需要处理了
      

  9.   

    那你自己把 5 楼代码中 J <= n 改成 J < n 不就行了吗? 有两处J <= n 需改.
      

  10.   

    你到底什么需求, 整理一下你的思路, 然后贴出来看. 不要画波形图.郁闷ing...
      

  11.   

    后来的需求与最初的需求根本就不一样
    type
      TArr = array[0..20] of Byte;var
      Arr : TArr = (1,0,2,2,2,2,2,0,4,0,4,4,4,0,6,3,3,3,3,0,3);procedure dododo(var A: TArr; n: Integer);
    var
      I, J, P, L: Integer;
    begin
      L := SizeOf(A[Low(A)]);
      J := 1;
      P := Low(A);
      for I := Low(A) to High(A) do
        if A[I] = 0 then begin
          if J < n then FillChar(A[P], (I-P)*L, 0);
          J:=1; P:=I;
        end else Inc(J);
      if (J < n) then FillChar(A[P], (High(A)+1-P)*L, 0);
    end;{--------以下是测试---------------------------}
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
    begin  dododo(Arr, 4);  Memo1.Clear;
      for I := Low(Arr) to High(Arr) do
        Memo1.Text := Memo1.Text + InttoStr(Arr[I]) + ',';
      {0,0,2,2,2,2,2,0,0,0,4,4,4,0,6,3,3,3,3,0,0,}
    end;
      

  12.   

    把27楼代码中的 dododo(Arr, 4);这句里的4改成5
    或者把27楼代码中的两处J < n改成J <= n