从数组中查找中间元素

时间:2010-11-15 15:49:08

标签: c++ arrays

在C ++中如何找到数组的中间'n'个元素?例如,如果n = 3,并且数组是[0,1,5,7,7,8,10,14,20],则中间是[7,7,8]。

P.S。在我的上下文中,n和数组的元素是奇数,所以我可以找到中间的。 谢谢!

4 个答案:

答案 0 :(得分:1)

这很快,没有经过测试但基本的想法......

const int n = 5;

// Get middle index
int arrLength = sizeof(myArray) / sizeof(int);

int middleIndex = (arrLength - 1) / 2;
// Get sides
int side = (n - 1) / 2;

int count = 0;

int myNewArray[n];

for(int i = middleIndex - side; i <= middleIndex + side; i++){
     myNewArray[count++] = myArray[i];
}

答案 1 :(得分:1)

int values[] = {0,1,2,3,4,5,6,7,8};
const size_t total(sizeof(values) / sizeof(int));
const size_t needed(3);

vector<int> middle(needed);
std::copy(values + ((total - needed) / 2), 
    values + ((total + needed) / 2), middle.begin());

没有检查所有可能的边界条件。根据样本数据,我可以根据需要获得middle = (3,4,5)

答案 2 :(得分:0)

好吧,如果你必须选择n个号码,你知道会有size - n个未经批准的项目。由于你想在中间选择数字,你想拥有尽可能多的“未选”数字。数组每一侧的数字,即(size - n) / 2

我不会做你的作业,但我希望这会有所帮助。

答案 3 :(得分:0)

嗯,天真的算法如下:

  1. 找到中间,因为您指定长度为奇数而存在。
  2. 反复向左挑选一个元素,向右挑选一个元素。您可以随时执行此操作,因为您指定n是奇数。
  3. 您还可以进行以下观察:

    请注意,在您选择中间后,还有n - 1个要素可供选择。这是偶数,(n - 1)/2必须来自中间元素的左侧,(n - 1)/2必须来自右侧。中间元素具有索引(length - 1)/2。因此,所选第一个元素的较低索引是(length - 1)/2 - (n - 1)/2,并且所选最后一个元素的较高索引是(length - 1)/2 + (n - 1)/2。因此,所需的指数为(length - n)/2 - 1(length + n)/2 - 1