有一个数组,想从0开始取100个数求最大最小值的下标差,一直到301-400,然后看出现次数最多的下标差是多少

问题相关代码
class GetCycle
{
    public int getCycle(float[] data)
    {
        int indexMin = 0;
        int indexMax = 0;
        List<int> cycleList = new List<int>();
        int[] cycleGather = null;
        int cycle = 0;
        var max = data[0];
        var min = data[0];

        //计算每100个数的周期
        for (int j = 0; j < data.Length - 100; j++)
        {
            for (int i = j; i < j + 100; i++)
            {
                if (max < data[i])
                {
                    int temp = 0;
                    max = data[i];
                    temp = i;
                    if (indexMax < temp)
                    {
                        indexMax = temp;
                    }
                }
                if (min > data[i])
                {
                    int temp = 0;
                    min = data[i];
                    temp = i;
                    if (indexMin < temp)
                    {
                        indexMin = temp;
                    }
                }
                cycleList.Add(Math.Abs(indexMax - indexMin) * 2);
            }                
        }

        cycleGather = cycleList.ToArray();
        //找出周期集合中重复次数最多的数值
        var res = from n in cycleGather
                  group n by n into g
                  orderby g.Count() descending
                  select g;

        var gr = res.First();
        foreach (var x in gr)
        {
            cycle = x;
        }
        return cycle;
    }
}
运行结果

我想每个小周期求一次下标差,但是按我写的代码求出来的结果是整个数组的最大最小值的下标差

不能都初始化为0,下标应该初始化为当前批次的开始下标,最大值和最小值应该初始化为数组中可能出现的最小值和最大值(注意反过来)
改下面这样。
而且
cycleList.Add(Math.Abs(indexMax - indexMin) * 2);
这句应该放到i循环外层,放内层没必要,每次i循环都加一个数到列表中


            //计算每100个数的周期
            for (int j = 0; j < data.Length - grpNum; j++)
            {
                max = -9999;//初始为这个值也不一定对,应该初始化为data数组中可能出现的最小值,要不都小于于这个的值下面的if判断就没搞了
                min =99999;//初始为这个值也不一定对,应该初始化为data数组中可能出现的最大值,要不都是大于这个的值下面的if判断就没搞了
                indexMin = indexMax = j;//这里应该初始化为批次的第一个下标,而不是0,要不max,min比较不通过那么可能为0
                for (int i = j; i < j + grpNum; i++)
                {
                    if (max < data[i])
                    {
                        int temp = 0;
                        max = data[i];
                        temp = i;
                        if (indexMax < temp)
                        {
                            indexMax = temp;
                        }
                    }
                    if (min > data[i])
                    {
                        int temp = 0;
                        min = data[i];
                        temp = i;
                        if (indexMin < temp)
                        {
                            indexMin = temp;
                        }
                    }
                }
                cycleList.Add(Math.Abs(indexMax - indexMin) * 2);////////////每组计算一次,不用放i循环中
            }

img

//计算每100个数的周期
for (int j = 0; j < data.Length - 100; j++)
外层循环不对吧,怎么是减去100呢? 既然每100个一组,那么j应该小于实际分成多少个组
int n = data.Length / 100;
if(data.Length%100 > 0) n++;
for(int j=0;j<n;j++)
定义一个 int temp = 0;干啥啊,完全没有用啊,temp改成i就行
另外在外层for循环的第一行,要对indexMax,indexMin、max和 min进行置0。重新开始判断下一组数据中的最大最小值