在C ++中如何找到数组的中间'n'个元素?例如,如果n = 3,并且数组是[0,1,5,7,7,8,10,14,20],则中间是[7,7,8]。
P.S。在我的上下文中,n和数组的元素是奇数,所以我可以找到中间的。 谢谢!
答案 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)
嗯,天真的算法如下:
n
是奇数。 您还可以进行以下观察:
请注意,在您选择中间后,还有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
。