题目: 有个t[100]存放了1~99的间数字用效率较高代码把重复数字去掉例如{1,2,2,2,3,5,6,6}变成{1,2,3,5,6}
××××××××××××××××××××××××××××××××××
申请标志
此题重复数字可能不只个上述求和思路方法不行了是高效率我们可以采用空间换时间策略来解决
设立访问标志数字化为0访问到N时将标志数字第N个元素置为N
最后遍历该若标志中对应值为非0则顺序存储该数字于原中最后返回去除重复数字后有效数个数
RemoveRep( .gif' />, n)
{
*.gif' />flag = ( *)malloc(n*());
left = 0, i = 0;
while(i<n)
.gif' />flag[i] = false; //化标志
for(i=0;i<n;i)//剔除算法
{
.gif' />flag[.gif' />[i]] = .gif' />[i]; //将出现过数保存到对应位置
}
for(i=0;i<n;i) //取出有效数
{
(.gif' />flag[i] != false)
.gif' />[left] = .gif' />flag[i];
}
left;
}
××××××××××××××××××××××××××××××××××
符号标志法
上述思路方法空间复杂度为O(N)利用符号位作为标志即可不申请O(N)标志
SignedRemoveRep( .gif' />, n)
{
i,left = 0;
for(i=0;i<n;i)//将出现过位置置负号标志
{
(.gif' />[i] > 0)
.gif' />[.gif' />[i]] = -.gif' />[.gif' />[i]];
.gif' />[-.gif' />[i]] = -.gif' />[-.gif' />[i]];
}
for(i=0;i<n;i)//抽取算法
{
(.gif' />[i] < 0) //根据标志顺序保存出现过值
.gif' />[left] = i;
}
left;
}
××××××××××××××××××××××××××××××××××
void (void)
{
t[100];
i,j,left;
for(i=0;i<100;i) //随机产生100个数字
{
j = rand%99+1;
t[i] = j;
prf("%d ",t[i]);
(i%10 9)
prf("\n");
}
//left = RemoveRep(t, 100);
left = SignedRemoveRep(t, 100);
for(i=0;i<left;i)
{
prf("%d ",t[i]);
(i%10 9)
prf("\n");
}
}
最新评论