找出被删除掉的数字

题目: 有一个整数数组(元素不重复),被删除了若干个元素。要求找出被删除的数字(按照在原数组里的位置保存)。只能通过给定的函数get()访问数组,要求访问的次数最少.

#define MAX_DATA_SIZE 1000
#define MAX_DELETED_SIZE	100

enum
{
	ORIGINAL_FILE,
	MODIFIED_FILE
};
struct result
{
	int count;
	int data[100];
};

int deleted_index[MAX_DELETED_SIZE];

int original_file[MAX_DATA_SIZE];
int modified_file[MAX_DATA_SIZE];
int deleted_index_map[MAX_DATA_SIZE];

int data[2][MAX_DATA_SIZE];
int get_count;

int data_size = 100;
int offset;

int get(int fileIndex, int index)
{
	if(get_count >= 2 * MAX_DATA_SIZE)
	{
		return -1;
	}

	get_count++;

	if(index >= data_size)
	{
		return 0;
	}
	if(fileIndex == ORIGINAL_FILE)
	{
		return original_file[index];
	}
	else if(fileIndex == MODIFIED_FILE)
	{
		return modified_file[index];
	}
}


///
int myGet(int fileIndex, int index)
{
	if(data[fileIndex][index] == 0)
	{
		data[fileIndex][index] = get(fileIndex, index);
	}
	return data[fileIndex][index];
}

int getLength(int fileIndex)
{
	int start = 0, end = MAX_DATA_SIZE-1;
	int mid;
	while(start < end)
	{
		mid = (start + end)/2; 
		if(myGet(fileIndex, mid) == 0)
		{
			end = mid;
		}
		else
		{
			start = mid + 1;
		}
	}
	return start;
}

struct result ret;

#if 0
int getDeletedItem(int &x1, int &y1, int &x2, int &y2)
{
	int mid1, int mid2; //= (start + end) / 2;
	while( x1 < y1)
	{
		mid1 = (x1 + y1) / 2;
		mid2 = (x2 + y2) / 2;
		if(myGet(ORIGINAL_FILE, mid1) != myGet(MODIFIED_FILE, mid2))
		{
			y1 = mid1;
			y2 = mid2;
		}
		else
		{
			x1 = mid1 + 1;
			x2 = mid2 + 1;
		}
	}

	ret.data[ret.count] = myGet(ORIGINAL_FILE, x1);
	ret.count++;

	return start;
}

#endif
int FindDeletedItems(int start, int end, int offset, int *deletedCount)
{
	if(end == start)
	{
		if(myGet(MODIFIED_FILE, start) != myGet(ORIGINAL_FILE, start + offset))
		{
			ret.data[ret.count] = myGet(ORIGINAL_FILE, start + offset);
			ret.count++;
			*deletedCount = *deletedCount - 1;

		}
		return ret.count;
	}
	int mid = (start + end) / 2;
	int value = myGet(MODIFIED_FILE, mid);
	if(value != myGet(ORIGINAL_FILE, mid + offset))
	 {
		 offset = FindDeletedItems(start, mid, offset, deletedCount);
	 }

	 if(*deletedCount != 0)
	 {
		return FindDeletedItems(mid + 1, end, offset, deletedCount);
	 }

}
void myfunc(void)
{
	int originalLength = getLength(ORIGINAL_FILE);
	int modifiedLength = getLength(MODIFIED_FILE);

	int datalen = originalLength - modifiedLength;
	FindDeletedItems(0, modifiedLength, 0, &datalen);
#if 0	
	int x1 = 0, x2 = 0, y1 = originalLength, y2 = originalLength;
	int offset = 0;
	while(datalen > 0)
	{
		int newStart = getDeletedItem(x1, y1, x2, y2);
		datalen--;
		x1 = newStart + 1;
		y = 
	}
#endif		
}
///
int main(void)
{
	int data_size = 100;
	int i;
	for(i = 0; i < data_size; i++)
	{
		original_file[i] = i+10;
	}

	for(i = 0; i < data_size; i++)
	{
		int m = random()%data_size;
		int n = random()%data_size;
		int temp = original_file[m];
		original_file[m] = original_file[n];
		original_file[n] = temp;
	}

	int j = 0;
	while( j < 10)
	{
		int k = random()%data_size;
		if(deleted_index_map[k] == 0)
		{
			deleted_index_map[k] = 1;
			j++;
		}
	}

	j = 0;

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

		if(deleted_index_map[i] == 0)
		{
			modified_file[j++] = original_file[i];
		}
	}

	myfunc();
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值