c++ - 所以我必须将数组旋转一个位置,但不分配数组以外的额外空间。这是一个正确的解决方案吗?
问题描述
这是我的解决方案。这是正确的吗?忽略 bits/stdc++.h 等。我只想知道它是否只使用分配给向量的空间。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cout << "Size of array?\n";
cin >> n;
int x[n];
for (int i = 0; i < n; i++) {
cout << "Input x[" << i << "]:\n";
cin >> x[i];
}
for (int i = 0; i < n; i++) {
cout << x[i] << "; ";
}
for (int i = 1; i<n; i++) {
swap(x[0],x[i]);
}
for (int i = 0; i < n; i++) {
cout << x[i] << "; ";
}
}
解决方案
对于初学者来说,像这样的可变长度数组
int n;
cout << "Size of array?\n";
cin >> n;
int x[n];
不是标准的 C++ 功能。相反,您应该使用标准容器std::vector<int>
。
要旋转数组或类型的对象,std::vector<int>
您可以使用标准算法std::rotate
。
至于你的代码,那么如果你想向左旋转数组,那么这个循环
for (int i = 1; i<n; i++) {
swap(x[0],x[i]);
}
应该写成
for (int i = 1; i<n; i++) {
swap(x[i-1],x[i]);
}
否则,您的循环将向右旋转数组。
这是一个演示程序。
#include <iostream>
#include <utility>
#include <vector>
int main()
{
std::vector<int> v = { 1, 2, 3, 4, 5 };
for ( const auto &item : v )
{
std::cout << item << ' ';
}
std::cout << '\n';
for ( size_t i = 1; i < v.size(); i++ )
{
std::swap( v[i-1], v[i] );
}
for ( const auto &item : v )
{
std::cout << item << ' ';
}
std::cout << '\n';
return 0;
}
程序输出为
1 2 3 4 5
2 3 4 5 1
这是一个演示程序,其中使用了标准算法std::rotate
。
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<int> v = { 1, 2, 3, 4, 5 };
for ( const auto &item : v )
{
std::cout << item << ' ';
}
std::cout << '\n';
std::rotate( std::begin( v ), std::next( std::begin( v ) ), std::end( v ) );
for ( const auto &item : v )
{
std::cout << item << ' ';
}
std::cout << '\n';
return 0;
}
程序输出与上图相同
1 2 3 4 5
2 3 4 5 1
推荐阅读
- ruby-on-rails - Rails Devise,如何正确嵌套资源
- excel - Excel VBA 的局限性?
- python - 使用python,我如何找出一个字符串是否包含除另一个列表中的字符之外的任何字符
- r - R If then do - 如何根据条件创建变量
- arrays - 将 PowerShell 中的多值属性导出到 Excel - 尝试使用哈希表数组实现自动化
- asp.net-core - 基于约定的路由的路由名称
- node.js - Koa-Router:如果请求不在 XHR 中,则跳过路由
- python - 如何将 pandas .agg() 与动态列名和多个函数一起使用?
- css - CSS背景:背景框外的字母g,p
- java - Spring Boot - 如何使用 Post 请求 (JSON) 发送对象数组