如何仅使用循环实现此类功能?
我打破了我的脑袋,我似乎无法直接思考。
这就是我提出的建议,但它甚至没有任何关闭。
for (int i = 0; i < elements; i++)
{
for (int n = elements; n > 0; --n)
a[i] = b[n];
}
答案 0 :(得分:7)
你在这里
chart7.Series["Series3"].ChartType = SeriesChartType.Line;
chart7.Series["Series3"].Points.DataBindXY(xVal, arrDouble3);
foreach (Series series in chart7.Series)
{
foreach (DataPoint arrP in series.Points)
{
if (arrP.YValues.Length > 0 && (double)arrP.YValues.GetValue(0) == 0)
{
arrP.IsValueShownAsLabel = false;
}
}
}
chart7.Series["Series3"].Points.DataBindXY(xVal, arrP); ????
程序输出
#include <iostream>
#include <algorithm>
#include <iterator>
int main()
{
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for ( int x : a ) std::cout << x << ' ';
std::cout << std::endl;
for ( auto it = std::begin( a ); it != std::end( a ); it == std::end( a ) ? it : ++it )
{
it = std::rotate( it, std::prev( std::end( a ) ), std::end( a ) );
}
for ( int x : a ) std::cout << x << ' ';
std::cout << std::endl;
}
编译器应支持C ++ 11算法0 1 2 3 4 5 6 7 8 9
9 0 8 1 7 2 6 3 5 4
。
P.S。我更改了循环的第三个表达式,它对于具有奇数个元素的序列是正确的。
另一种方法是使用标准算法std::rotate
类似于以下内容
std::copy_backward
程序输出
#include <iostream>
#include <algorithm>
#include <iterator>
template <class BidirectionalIterator>
void alternate( BidirectionalIterator first, BidirectionalIterator last )
{
if ( first != last && first != --last )
{
while ( first != last )
{
auto value = *last;
std::copy_backward( first, last, std::next( last ) );
*first++ = value;
if ( first != last ) ++first;
}
}
}
int main()
{
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for ( int x : a ) std::cout << x << ' ';
std::cout << std::endl;
alternate( std::begin( a ), std::end( a ) );
for ( int x : a ) std::cout << x << ' ';
std::cout << std::endl;
}
答案 1 :(得分:3)
您可以使用计数器i
从0
转到len / 2
。并相应地存储。
伪代码看起来应该是这样的。
len = length of array
counter = 0
For i = 0 to (len / 2):
a[counter++] = b[len - i]
a[counter++] = b[0 + i]
答案 2 :(得分:2)
这会起作用吗?...如果你可以使用另一个数组...... a
而原始来自b
for (int i = 0, i_even = 1, i_odd = 0; i < elements; i++)
{
if(i % 2 == 0){
a[i] = b[elements-i_even];
++i_even;
}
else {
a[i] = b[i_odd];
++i_odd;
}
完整示例:
#include <iostream>
#include <vector>
using namespace std;
vector<int> switched(const vector<int>& b){
const std::size_t sz = b.size();
vector<int> a(sz);
for (int i = 0, i_even = 1, i_odd = 0; i < sz; i++) {
if(i % 2 == 0) {
a[i] = b[sz-i_even];
++i_even;
}
else {
a[i] = b[i_odd];
++i_odd;
}
}
return a;
}
void print(const vector<int>& v){
for (auto e: v)
cout << e << " "; cout << endl;
}
int main()
{
vector<int> b{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
print(b);
print(switched(b));
return 0;
}
答案 3 :(得分:1)
没有 if
的小解决方案std::vector<int> a{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
std::vector<int> b;
b.reserve(a.size());
size_t l = a.size() - 1;
for (int i = 0; i < a.size(); ++i)
{
b.push_back( a[(i / 2) + ((i + 1) % 2) * (l - i)] );
}
for (int i = 0; i < b.size(); ++i)
{
std::cout << b[i] << "\n";
}
它适用于整数运算。
答案 4 :(得分:0)
在我的脑海中,这有效:
a[] = b[];
len= lenght of a;
for(int i=0; i<len/2; i++)
{
int j = 0;
a[j] = b[len-i];
j++;
a[j] = b[i];
}
请注意,这可能会导致奇数阵列长度出现问题。
答案 5 :(得分:0)
另一种方法是倒退。在位置i结束的元素来自?
dest src
0 0
1 size-1
2 1
3 size-2
4 2
5 size-3
因此,如果dest
为偶数,src=dest/2
且dest
为奇数,src=size-1-(dest/2)
。
此方法的优点是您不需要奇数长度输入的特殊代码。