假设您在给定域中有数字,例如:[ - 4,4]
还假设这组数字在数组中,并且在数字顺序中,如下所示:
[ - 4,-3 -2,-1,0,1,2,3,4]
现在假设我想为这组数字创建一个新的零点,如下所示:(我选择 -2 作为我的新轴,并且所有元素都相应地移动了)
原文:[ - 4,-3 -2 ,-1,0,1,2,3,4]
归零:[ - 2,-1 0 ,1,2,3,4,-4,-3]
使用新的归零数组,假设我有一个名为:
的函数“int getElementRelativeToZeroPosition(int zeroPos,int valueFromOriginalArray,int startDomain,int endDomain){...}”
示例用法:
我得到3个原始数组,并希望看到它在归零数组上的映射位置,其中零点为-2。
getElementRelativeToZeroPosition(-2,3,-4,4)= -4
无需创建任何数组并为此映射移动元素,我如何数学生成上述函数的所需结果?
答案 0 :(得分:2)
我会这样做:
如果您的数组从零开始:
index(0) => 4
index(-2) => 2
index(3) => 7
array_size => 9
move_vector => index(0) - index(-2)
=> 4 - 2 => +2
new_pos(3) => (index(3) + move_vector) modulo array_size
=> (7 + 2) mod 9 => 0
value_at(0) => -4
就是这样
答案 1 :(得分:1)
从数学角度讲,如果你有一个由包含范围[start, stop]
给出的隐含整数集,那么选择一个新的零点的选择实际上是选择一个索引来开始。计算此索引后,您可以计算查询点的索引(在原始域中),并找到它们之间的差异以获得偏移量:
例如:
4 - (-4) + 1= 9
-2 - (-4) = -2 + 4 = 2
3 - (-4) = 3 + 4 = 7
7 - 2 = 5
,因此元素3距元素-2五跳。同样地,它是5-len(range) = 5 - 9 = -4
跳跃。您可以点min(abs(5), abs(-4))
查看您更喜欢哪一个。答案 2 :(得分:0)
你可以编写一个双重链表,头节点指向开头
struct nodeItem
{
nodeItem* pev = nullptr;
nodeItem* next = nullptr;
int value = 0;
}
class Node
{
private:
nodeItem* head;
public:
void SetHeadToValue(int value);
...
}
最后一个值应指向第一个值旁边,因此您有一个循环列表。
要想知道,如果你在列表的末尾,你必须检查项目是否等于头节点