これが私が数日間取り組んできた問題です。
ソートされた配列を取得するプログラムを作成する必要があります。プログラムは、2つの隣接するブロックが同じ値を持つ999を配置し、次にすべての999を配列の最後に配置します。別の配列を使用せずにこれを行う必要があり、プログラムはO(n)である必要があります。
入力例:
50,60,60,72,81,81,81,81,93,93
必要な出力:
50,60,72,81,93,999,999,999,999,999
もう一つの例:
1,1,2,3,4,4,5,6,6
必要な出力:
1,2,3,4,5,6,999,999,999
私のコード。動いていない。最初の例では、出力は問題ありません。2番目の例では、1,2,3,4,5,4,5,6、-14568127(配列の範囲外)を取得します
私のアルゴリズムは、iとjの2つのインデックスを持つ配列をウォークスルーし、a [i]!= a [i + 1]の場合、iを進めます。それらが等しい場合、jは次の一意の値を探し、それをa [i+1]に入れます。
これを行うためのより良いアイデアやコードを聞きたいです。Cで。
while((j!=size-1)&&(a[size-1]!=a[i]))
{
if(a[i]!=a[i+1])
{
i++;
j=i;
}
if(a[i]==a[i+1])
{
j=i;
while(a[i]==a[j])
j++;
a[i+1]=a[j];
i++;
if(j!=size-1)
j=i;
}
}
i++
for(;i<size;i++)
a[i]=999;
私はコードを編集しましたが、今はchenが提案したように編集しています。まず、doubleが存在する場所に999を配置して配列を反復処理しますが、切り替えたいときに問題が発生します。配列を再ソートするために私が書いたコードは次のとおりです。999をどこかに置くたびに、count++。
それは私が完全に与えた2つの例のために働いています。みんな、ありがとう。
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int *a;
int i=0,j=0,size,count=0;
printf("Enter the size of the array\n");
scanf("%d", &size);
a=(int *)calloc(size,sizeof(int));
printf("Enter %d numbers\n",size);
for(i=0;i<size;i++)
scanf("%d",&a[i]);
printf("The array recieved is :\n");
for(i=0;i<size;i++)
printf(" %d ", a[i]);
i=0;
printf("\n");
for(i=0;i<size;i++)
{
if(a[i]==a[i+1])
{
j=i+1;
while(a[i]==a[j])
{
a[j]=999;
j++;
}
count++;
}
}
while(count!=0)
{
for(i=0;i<size-1;i++)
{
j=i;
if(a[j]==999)
{
a[j]=a[j+1];
a[j+1]=999;
}
}
count--;
}
printf("The new array is: \n");
for(i=0;i<size;i++)
printf(" %d ",a[i]);
free(a);
getch();
}