例如,大小为10的数组a
包含以下数据:
0.0
0.01
0.02
0.03
5.04
6.05
7.06
13.07
20.08
22.09
如果固定的步长为5,则预期的数据范围为:
start end
0.0 0.03
5.04 7.06
13.07 13.07
20.08 22.09
在C / C ++中实现它的任何建议?如何编程?
答案 0 :(得分:1)
您可以使用简单循环,保存最后一个开始范围。在C ++中直接实现:
#include <utility>
#include <vector>
vector<pair<size_t, size_t> > getRanges (vector<double> array)
{
vector<pair<size_t, size_t> > result;
size_t indexLastStart = 0;
double valueLastStart = array[0];
for (size_t i = 1; i < array.size(); i++)
{
if (array[i] - valueLastStart > 5.0)
{
result.push_back(make_pair(indexLastStart, i - 1));
indexLastStart = i;
valueLastStart = array[i];
}
}
result.push_back(make_pair(indexLastStart, array.size() - 1));
return result;
}
您可以使用以下功能:
int main()
{
double t[] = {
0.0,
0.01,
0.02,
0.03,
5.04,
6.05,
7.06,
13.07,
20.08,
22.09
};
vector<double> a(t, t + sizeof t / sizeof *t);
vector<pair<size_t, size_t> > r = getRanges(a);
for (size_t i = 0; i < r.size(); i++)
cout << a[r[i].first] << "\t" << a[r[i].second] << endl;
return 0;
}
在C中,它可能看起来像:
#include <stdio.h>
struct range
{
int start;
int end;
};
size_t getRanges(struct range *result, double *array, size_t inputSize)
{
size_t outputSize = 0;
size_t indexLastStart = 0;
double valueLastStart = array[0];
struct range added;
size_t i;
for (i = 1; i < inputSize; i++)
{
if (array[i] - valueLastStart > 5.0)
{
added.start = indexLastStart;
added.end = i - 1;
result[outputSize++] = added;
indexLastStart = i;
valueLastStart = array[i];
}
}
added.start = indexLastStart;
added.end = inputSize - 1;
result[outputSize++] = added;
return outputSize;
}
int main()
{
double t[10] =
{
0.0,
0.01,
0.02,
0.03,
5.04,
6.05,
7.06,
13.07,
20.08,
22.09
};
struct range result[10];
size_t i;
size_t size = getRanges(result, t, sizeof t / sizeof *t);
for (i = 0; i < size; i++)
{
printf("%.2f\t%.2f\n", t[result[i].start], t[result[i].end]);
}
return 0;
}
此算法以线性时间O(n)
运行。
答案 1 :(得分:1)
你可以在一个简单的循环中完成:
#include <stdio.h>
int main(void)
{
float f, a[] = {0.0, 0.01, 0.02, 0.03, 5.04, 6.05, 7.06, 13.07, 20.08, 22.09};
size_t i;
#define N (sizeof a / sizeof a[0])
for (f = a[0], i = 0; i <= N; i++) {
if (i == N || a[i] > f + 5.0) {
printf("%f %f\n", f, a[i - 1]);
if (i != N) f = a[i];
}
}
return 0;
}
答案 2 :(得分:1)
#include <iostream>
using namespace std;
int fun(double* arr, int n, double* res)
{
int start = 0;
int end = 0;
int len = 0;
for(int i = start; i < n; ++i)
{
if(arr[i]- arr[end] < 5)
{
end = i;
}
else
{
res[len++] = arr[start];
res[len++] = arr[end];
start = end = i;
}
}
res[len++] = arr[start];
res[len++] = arr[end];
return len;
}
int main()
{
double t[] = {
0.0,
0.01,
0.02,
0.03,
5.04,
6.05,
7.06,
13.07,
20.08,
22.09
};
int n = sizeof(t) / sizeof(*t);
double *res = new double[n];
int k = fun(t, n, res);
for(int j = 0; j < k; j += 2)
cout<<res[j]<<" "<<res[j+1]<<endl;
}
答案 3 :(得分:0)
稍晚,但无论如何,这是我对C ++的非常紧凑的实现。
template <typename T>
std::vector<std::pair<T, T>> generate_pairs(T *first, T *last)
{
std::vector<std::pair<T, T>> result(std::distance(first, last) / 2);
std::generate(std::begin(result), std::end(result), [&first] { return std::make_pair(*first++, *first++); });
return result;
}
int main(int argc, char *argv[])
{
double arr[] = { 0.0, 0.01, 0.02, 0.03, 5.04, 6.05, 7.06, 13.07, 20.08, 22.09 };
auto v = generate_pairs(std::begin(arr), std::end(arr));
for (const auto &p : v)
std::cout << "(" << p.first << ", " << p.second << ")" << std::endl;
return 0;
}
答案 4 :(得分:-1)
在C#中,你可以使用List轻松地在一行中完成:
float[] subArray = new List<float>(myArray).GetRange(0, 8).ToArray();