Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;按以下顺序切换数组顺序的算法:[Last,First,Last-1,First+;1…]_C++_Arrays_Algorithm_C++11_Iterator - Fatal编程技术网

C++ C++;按以下顺序切换数组顺序的算法:[Last,First,Last-1,First+;1…]

C++ C++;按以下顺序切换数组顺序的算法:[Last,First,Last-1,First+;1…],c++,arrays,algorithm,c++11,iterator,C++,Arrays,Algorithm,C++11,Iterator,我如何仅使用循环来实现这样的函数 我的头都快碎了,我就是不能正常思考 这就是我想到的,但它一点也不接近 for (int i = 0; i < elements; i++) { for (int n = elements; n > 0; --n) a[i] = b[n]; } for(int i=0;i0;--n) a[i]=b[n]; } 这行吗?。。。如果您可以使用另一个数组,这将非常简单a而原件来自b for (int i = 0, i_even =

我如何仅使用循环来实现这样的函数

我的头都快碎了,我就是不能正常思考

这就是我想到的,但它一点也不接近

for (int i = 0; i < elements; i++)
{
    for (int n = elements; n > 0; --n)
        a[i] = b[n];
}
for(int i=0;i0;--n)
a[i]=b[n];
}

这行吗?。。。如果您可以使用另一个数组,这将非常简单<代码>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;
}
for(int i=0,i_偶=1,i_奇=0;i
完整示例:

#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;
}
#包括
#包括
使用名称空间std;
矢量交换(常数矢量和b){
常数std::size_t sz=b.size();
载体a(sz);
对于(int i=0,i_偶数=1,i_奇数=0;icout您可以使用计数器
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]

在我的头脑中,这起了作用:

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];
}
a[]=b[];
len=a的长度;
对于(inti=0;i,给你

#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算法
std::rotate

p.S.I更改了循环的第三个表达式,即对于具有奇数个元素的序列是正确的

另一种方法是使用标准算法
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;
}        

另一种方法是反向工作。在位置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)


这种方法的优点是,奇数长度输入不需要特殊代码。

如果不使用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";
}
std::向量a{0,1,2,3,4,5,6,7,8,9,10};
std::载体b;
b、 储备(a.size());
尺寸=a.尺寸()-1;
对于(int i=0;istd::cout-In-place或可以使用临时表吗?使用STL计数(它们在下面使用循环)吗。那就好了,我只是想知道循环算法如何解决这样的问题。不。请注意,任务不是反转数组。请查看问题标题中的顺序…@leems…更正…我必须承认Vlad的答案更圆滑。:-)@WhiZTiM您的解决方案在处理数组时遇到问题。它不会在适当的位置更改数组。@VladfromMoscow这是时空权衡的事情…这是我能想到的唯一O(n)解决方案{空间开销}。这就是为什么我在回答中指出“。如果您可以使用另一个数组…”如果原始数组中有奇数个元素怎么办?@JanDvorak它会旋转序列,并向右移动旋转的初始元素。@JanDvorak是的,它工作了!…我验证了他的正确性answer@MSalters看起来是这样。:)我有点失望。大多数人更喜欢O(N*N)而不是O(N)。1000000个条目的小测试达到43809毫秒。其中一个线性解决方案达到6毫秒。@TunichGut是的,线性解决方案比非线性解决方案更有效。如果速度非常重要,则应使用线性解决方案。
dest src 
0    0
1    size-1

2    1
3    size-2

4    2
5    size-3
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";
}