題目: 有一個(gè)數(shù)組t[100],存放了1~99之間的數(shù)字,用效率較高的代碼把重復(fù)數(shù)字去掉。例如數(shù)組{1,2,2,2,3,5,6,6}變成{1,2,3,5,6}。
××××××××××××××××××××××××××××××××××
申請標(biāo)志數(shù)組
此題重復(fù)的數(shù)字可能不只一個(gè),上述求和的方法不行了。因?yàn)槭歉咝?,我們可以采用空間換時(shí)間的策略來解決。
設(shè)立訪問標(biāo)志數(shù)字,初始化為0,訪問到N時(shí)將標(biāo)志數(shù)字的第N個(gè)元素置為N
最后遍歷該數(shù)組,若標(biāo)志數(shù)組中對應(yīng)值為非0,則順序存儲該數(shù)字于原數(shù)組中,最后返回去除重復(fù)數(shù)字后的有效數(shù)的個(gè)數(shù)
int RemoveRep(int array[], int n)
{
int *arrayflag = (int *)malloc(n*sizeof(int));
int left = 0, i = 0;
while(i arrayflag[i++] = false; //初始化標(biāo)志數(shù)組
for(i=0;i {
arrayflag[array[i]] = array[i]; //將出現(xiàn)過的數(shù)保存到對應(yīng)的位置
}
for(i=0;i {
if(arrayflag[i] != false)
array[left++] = arrayflag[i];
}
return left;
}
××××××××××××××××××××××××××××××××××
符號標(biāo)志法
上述方法的空間復(fù)雜度為O(N),利用符號位作為標(biāo)志即可不申請O(N)標(biāo)志數(shù)組
int SignedRemoveRep(int array[], int n)
{
int i,left = 0;
for(i=0;i {
if(array[i] > 0)
array[array[i]] = -array[array[i]];
else
array[-array[i]] = -array[-array[i]];
}
for(i=0;i {
if(array[i] < 0) //根據(jù)標(biāo)志順序保存出現(xiàn)過的值
array[left++] = i;
}
return left;
}
××××××××××××××××××××××××××××××××××
void main(void)
{
int t[100];
int i,j,left;
for(i=0;i<100;i++) //隨機(jī)產(chǎn)生100個(gè)數(shù)字
{
j = rand()%99+1;
t[i] = j;
printf("%d ",t[i]);
if(i%10 == 9)
printf("\n");
}
//left = RemoveRep(t, 100);
left = SignedRemoveRep(t, 100);
for(i=0;i {
printf("%d ",t[i]);
if(i%10 == 9)
printf("\n");
}
}
××××××××××××××××××××××××××××××××××
申請標(biāo)志數(shù)組
此題重復(fù)的數(shù)字可能不只一個(gè),上述求和的方法不行了。因?yàn)槭歉咝?,我們可以采用空間換時(shí)間的策略來解決。
設(shè)立訪問標(biāo)志數(shù)字,初始化為0,訪問到N時(shí)將標(biāo)志數(shù)字的第N個(gè)元素置為N
最后遍歷該數(shù)組,若標(biāo)志數(shù)組中對應(yīng)值為非0,則順序存儲該數(shù)字于原數(shù)組中,最后返回去除重復(fù)數(shù)字后的有效數(shù)的個(gè)數(shù)
int RemoveRep(int array[], int n)
{
int *arrayflag = (int *)malloc(n*sizeof(int));
int left = 0, i = 0;
while(i
for(i=0;i
arrayflag[array[i]] = array[i]; //將出現(xiàn)過的數(shù)保存到對應(yīng)的位置
}
for(i=0;i
if(arrayflag[i] != false)
array[left++] = arrayflag[i];
}
return left;
}
××××××××××××××××××××××××××××××××××
符號標(biāo)志法
上述方法的空間復(fù)雜度為O(N),利用符號位作為標(biāo)志即可不申請O(N)標(biāo)志數(shù)組
int SignedRemoveRep(int array[], int n)
{
int i,left = 0;
for(i=0;i
if(array[i] > 0)
array[array[i]] = -array[array[i]];
else
array[-array[i]] = -array[-array[i]];
}
for(i=0;i
if(array[i] < 0) //根據(jù)標(biāo)志順序保存出現(xiàn)過的值
array[left++] = i;
}
return left;
}
××××××××××××××××××××××××××××××××××
void main(void)
{
int t[100];
int i,j,left;
for(i=0;i<100;i++) //隨機(jī)產(chǎn)生100個(gè)數(shù)字
{
j = rand()%99+1;
t[i] = j;
printf("%d ",t[i]);
if(i%10 == 9)
printf("\n");
}
//left = RemoveRep(t, 100);
left = SignedRemoveRep(t, 100);
for(i=0;i
printf("%d ",t[i]);
if(i%10 == 9)
printf("\n");
}
}