写了个算法实现,就想做个记录。以后有时间测试下正确性,以及是否有更好的思路。
//有一无符号整型数组,大小为10, 初始的数值随机,但在[0, 99]之间。请用C语言写一个过滤程序,令数组内的数据互不相等。
// 说明:
// 1.若数组内有相等的数据,可令某一数值加1或减1作出偏移,直至不等为止。
// 2.数组内的数据只能在[0, 99]之间。
// 3.数组第一次出现的数据保持不变,以后再次出现才进行相应的修改。
void GenNumber( unsigned int src[] , int num )
{
unsigned int ALERT_FLAG = 100;//标志已经不是第一次出现了
unsigned int arr[100];
memset( arr, 0 , sizeof(arr) );
for ( int n = 0; n < num; n++ )
{
arr[src[n]]++; //标志已经出现过
}
for ( int n = 0; n < num; n++ )
{
if ( arr[src[n]] > 1 && arr[src[n]] != ALERT_FLAG )
{
arr[src[n]] = ALERT_FLAG;
continue;
}
if ( arr[src[n]] == ALERT_FLAG )
{
unsigned int newValue = ++src[n];
while( arr[newValue] && newValue <= 99 )
{
newValue = ++src[n];
}
if (src[n] > 99)
{
src[n] = 99;
newValue = --src[n];
while( arr[newValue] )
{
newValue = --src[n];
}
}
arr[newValue]++;
}
}
}
void main()
{
unsigned int arr[] = { 1, 3, 5, 3, 5, 3, 11 };
// unsigned int arr[] = { 1, 3, 5, 99, 99, 99, 11 };
// unsigned int arr[] = { 98, 98, 98, 99, 99, 99, 11 };
GenNumber(arr, sizeof(arr)/sizeof(*arr));
system("puse");
}