问题描述:
一个360度的圆环上以相同间隔有360个数据点,其中包含异常数据点(比如Nan),要求找到此环上的所有值连续增加的序列的集合。
解决思路:
1、首先从所给环中找到第一个数据下降的点或是异常点,以此作为递增序列查找的初始点,并进行保存;
2、从初始点开始循环,找到一个正常的数据点,则从下一个点开始循环搜寻增长序列,直到遇到异常数据或数值下降为止,若增长的数列所含数值个数大于等于2,对此序列进行保存;
3、当步骤2循环到末尾,若末尾的数值小于最开始的数值,将两者进行合并保存。
以下为代码实现部分,主要是基于C#语言, 编码软件 Microsoft Visual Studio 2019
核心代码实现:
using System;
using System.Collections.Generic;
namespace ConsoleApp2
{
class Program
{
public List<List<float>> searchlist (List<float> datalist)
{
List<List<float>> vectorlist = new List<List<float>>();
int num = 0;
int q = 0;
while (q < datalist.Count)
{
if (datalist[q] != -1)
{
if (datalist[q+1] != -1 && datalist[q+1] >= datalist[q])
{
num += 1;
q++;
}
else
{
num += 1;
break;
}
}
else
{
break;
}
}
int init = num;
int j;
while (num < datalist.Count)
{
if (datalist[num] != -1)
{
j = num + 1;
while (j < datalist.Count && datalist[j] != -1 && (datalist[j] >= datalist[j - 1]))
{
j++;
}
if (j - num > 1)
{
if (j == datalist.Count)
{
if (init >= 1)
{
List<float> data = new List<float>();
if (datalist[datalist.Count - 1] <= datalist[0])
{
for (int s = num; s < datalist.Count; s++)
{
data.Add(datalist[s]);
}
for (int t = 0; t < init; t++)
{
data.Add(datalist[t]);
}
}
vectorlist.Add(data);
break;
}
}
else
{
List<float> data = new List<float>();
for (int k = num; k < j; k++)
{
data.Add(datalist[k]);
}
vectorlist.Add(data);
}
}
else if (j == datalist.Count && j - num == 1)
{
if (init >= 1)
{
List<float> data = new List<float>();
if (datalist[datalist.Count - 1] <= datalist[0])
{
for (int s = num; s < datalist.Count; s++)
{
data.Add(datalist[s]);
}
for (int t = 0; t < init; t++)
{
data.Add(datalist[t]);
}
}
vectorlist.Add(data);
break;
}
}
num = j;
}
else
{
num += 1;
}
}
return vectorlist;
}
测试代码:
static void Main(string[] args)
{
Program p = new Program();
List<float> datalist = new List<float>() { 3, 4, -1, 1, 2, -1, -1, 3, 3, 5, 4, -1, 0, 1, 2, 2};
List<List<float>> vectorlist = p.searchlist(datalist);
for (int i = 0; i < vectorlist.Count; i++)
{
for (int j = 0; j< vectorlist[i].Count; j++)
{
Console.Write(vectorlist[i][j].ToString());
}
Console.WriteLine("\nfinished");
}
Console.WriteLine("over");
}
测试结果:
12
finished
335
finished
012234
finished
over
ps:
初入C#语言,一点愚见,还望大神指点瑕疵或高明方法。