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;i cout您可以使用计数器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;i std::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";
}