2012-01-04 4 views
-1

1次元配列にランレングスエンコーディングの種類を実行するが、依然として望みの結果から遠く離れた小さなコードを記述しました。このCコードで目的の結果を得るために変更する必要がある

main() 
{ 
    int a[8]={2,0,0,0,3,0,0,9}; 
    int i,temp,ct=0,flag,m; 
    int found[90]={0}; 
    for(i=0;i<=7;i++) 
    { 
     if(!a[i]) 
     { 
      ct++; 
      if(!found[a[i]]) 
      { 
       flag=i; 
       found[a[i]]=1; 
      } 
     } 
    } 

    a[flag]=ct; 
    m=ct;  
    for(i=0;i<m;i++) 
    { 
     printf("%d",a[i]); 
    }  
}/* end of main*/ 

今以上の配列のために私はその上の任意の提案を持つことができます

2 5 0 0 3 

を取得していたコードの私の作品で

2 5 0 3 9 

しかし、以下の出力に何かを持っていると思いますか?

+1

これまでのところ、121の質問がありましたが、まだ*あなたのコードをフォーマットすることを学んだことはありませんか? –

+0

私のコードをフォーマットするにはどうすればいいですか –

+1

各行の前に4つのスペースを挿入してください。あなたはNotePad ++でこれを行うことができます。コードを貼り付けてすべてを選択し、タブをタップして貼り付けてSO –

答えて

3

2,0,0,0,3,0,0,9を長さエンコードして2 1 0 3 3 1 2 0 9 1にしないでください。

1)最初に間違っているのは、配列全体を見ていないということです。 <を使用して8の前に停止しますが、7で停止するので、配列項目0〜6のみを評価します。

2)ctがカウントを表す場合、リセットされません(宣言時にのみct = 0)。また、割り当てはこれです:a [flag] = ct;元のデータを上書きします。それは基本的にiの値を追跡します。

これは私がちょうど一緒に入れている私のバージョンです:

#define SZ 8 

main() 
{ 
    int a[SZ]={2,0,0,0,3,0,0,9}; 
    int i; //absolute position 

    int zero_count = 0; //target zeros specifically... 

    for (i = 0; i < SZ; i++) { 
     if (a[i] == 0) 
      zero_count++; 
    } 

    //now write it out in a bizarre, unparsable format again... 

    for (i = 0; i < SZ; i++) { 

     if (a[i] != 0)   //write out all non zero values 
      printf("%d ", a[i]); 

     if (i == 0) { //this says put the zero count after the first number was printed 
      printf("%d 0 ", zero_count); //inserting it into a strange place in the array 
     } 

    } 

    return 0; 
} 
:出力はコメントに基づいて[OK]をあなたのアルゴリズムは、実際にこのようになり、下の左 2 1 0 3 3 1 0 2 9 1

ある

#define SZ 8 

main() 
{ 
    int a[SZ]={2,0,0,0,3,0,0,9}; 
    int i; //absolute position 

    int runningCount = 1; //because we start at array index 1 and not zero 

    for (i = 1; i <= SZ; i++) { 
     if (a[i - 1] == a[i]) //value same as one before it... 
      runningCount++; 
     else { // new value found. print last one, and the count of the last one. 
      printf("%d %d ", a[i - 1], runningCount); 
      runningCount = 1; //reset for next loop 
     } 
    } 

    return 0; 
} 

出力:2 5 0 3 9

+0

正確にランレングスエンコーディングではありませんが、1つの場所に0の数を入れようとしています –

+0

私はそこに着く方法がわからないので、2 5 0 3 9の希望の答えにどうやって到着したらいいのか詳しく教えてください? – Philluminati

+0

この2 5 0 3 9何が望まれますか。元の配列2 0 0 0 3 0 0 9を見ると、それは0の5つの出現を持ち、2 5 0 3 9のような1つの場所に配置する必要があるもの余分な0を削除する必要があります。ただ1つの0は、この要素が繰り返しで発生したことを伝えるためにそこにあるはずです –

0

あなたは、あなたのループのために= <が必要になります。

for(i=0;i<=7;i++) 

代わりの

for(i=0;i< 7;i++) 

そうでない場合は、あなたが最後の要素を欠場します。

+1

これは本当ですが、実際には結果を変更することさえありません。ここには大きな問題があります。 –

0

あなたがしているように見えるのは、(a)配列に0が発生する回数をカウントし、(b)最初の0をそのカウントで置き換えることです。これがどのように有用なエンコードであるかははっきりしていません。

いずれにしても、アレイの1つの要素のみを変更しているため、少なくとも部分的には結果が得られません。私はあなたが欲しいと思う、または少なくともあなたが望むと思う、あなたがそれらに遭遇すると、配列のゼロでない要素を左にシフトすることです。

あなたが提案した方法で配列を圧縮するユーティリティとは何ですか?元のコードを再構築する必要があるコードもありますか?そうであれば、希望の結果からどのように期待しますか?

+0

正直言って私は、このエンコーディングスキームの使用を知らない、それは単にインタビューで尋ねられています。そしてこの質問のオリジナルバージョンは、このエンコーディングを2次元配列に載せています。 –

関連する問題