0

我创建了一个应用程序,其中用户不断围绕 z 轴(偏航)旋转手机,手机屏幕朝上。每次旋转改变方向时,我想生成两个极端之间的角度。

想象一个包含以下值的数组:[-5,-3,-2, 0, 1, 2, 6, 5, 3, 2,-1,-3,-4,-7,-4,-3, ...]。我想做的是找到数组的相对最大值和最小值,以便找到从一个相对最小值到下一个相对最大值的差异。在给定的数组中,-5 将是第一个相对最小值,然后 6 将是下一个相对最大值。这里的差异是 11 个单位。从相对最大值 6 开始,下一个相对最小值是 -7。这里的差异是 13 个单位。该过程将继续进行,直到阵列结束。我希望将这些差异值输入到它们自己的数组中,即 [11,13,...]。非常感谢任何帮助!

4

3 回答 3

0

我解决这个问题的方法是首先编写一个算法来检测最大值和最小值的索引,然后从那里找到差异。

要获得最大值和最小值,我建议遍历数组并查看当前值与前一个值和下一个值之间的差异。您需要查看差异符号的变化:当差异从负变为正时会出现最小值,当差异从正变为负时会出现最大值。

例如,查看数组的这一部分:[1,2,6,5,3]。从 1 到 2 的差异是正数,从 2 到 6 是正数,但从 6 到 5 是负数。差异的符号在 6 处从正变为负,因此我们知道它是最大值。

请注意,您还需要包括第一个和最后一个元素作为可能的最大值或最小值。

一旦你得到最大值和最小值的索引,你应该能够相当容易地得到它们的差异。

于 2013-07-18T21:07:24.590 回答
0

在最基本的意义上,您可以遍历数组,检查下一个值是大于还是小于前一个值。每当您达到变化(增加,现在减少,反之亦然)时,您都会(分别)找到相对的最大值/最小值。用于迭代的 for 循环,用于检查的布尔标志(无论您是增加还是减少)以及要检查/存储的数组中当前和先前索引的明显知识。

我不太愿意为此提供确切的代码,因为它非常基本并且看起来非常像一个家庭作业问题......

于 2013-07-18T21:07:39.630 回答
0

我看到你在数组中的第一个值始终是你的初始相对最小值和最大值,因为你从一开始就绝对没有比较基础(除非你将 relMin 和 relMax 都设置为 0 或定义一个范围来找到你的 relMin和relMax)。考虑到这一点,鉴于您假设使用 -5 和 6 作为第一个比较对,您的示例背后的逻辑本身就有缺陷。

让我们使用您的数组并使用 For 循环遍历数组...

[-5,-3,-2, 0, 1, 2, 6, 5, 3, 2,-1,-3,-4,-7,-4,-3,...]

0:relMin = -5,relMax = -5,delta = 0

1:relMin = -5,relMax = -3,delta = 2

2:relMin = -5,relMax = -2,delta = 3

3:relMin = -5,relMax = 0,delta = 5

4:relMin = -5,relMax = 1,delta = 6

5:relMin = -5,relMax = 2,delta = 2

6:relMin = -5,relMax = 6,delta = 11

7:

……

13:relMin = -7,relMax = 6,delta = 13

……

本质上,您所做的就是在您当前的增量不等于您之前的增量的任何时候写入您的输出数组。由于 relMin 和 relMax 之间的变化是互斥的(当您遍历数组时,只有其中一个值可以改变)所以您需要检查的是不等式......

//prime your values
//if it make sense for your purposes prime them both with 0
//this also assumes you have at least 1 value in valueArray
relMin = valueArray[0];
relMax = valueArray[0];

//the following line will always be true if you use valueArray[0] as your relMin and relMax baseline
deltaArray[0] = 0;
for (i = 0; i < [valueArray count]; i++)
{
 if (valueArray[i] < relMin)
 {
  relMin = valueArray[i];
 }
 if (valueArray[i] > relMax)
 {
  relMax = valueArray[i];
 }
 deltaPrevious = deltaArray[[deltaArray count] - 1];
 deltaCurrent = relMax - relMin;
 if (deltaCurrent != deltaPrevious)
 {
  deltaArray[deltaArray count] = deltaCurrent;
 }
}
于 2013-07-19T00:45:31.937 回答