【发布时间】:2021-11-02 00:41:15
【问题描述】:
我有两个解决这个问题的方法,但哪一个是最佳的?
给出了 N 个数字的列表。玩家必须排列数字,以使列表中的所有奇数都排在偶数之后。编写一个算法来排列给定的列表,使得列表的所有奇数都排在偶数之后。
输入
输入的第一行由一个整数组成,表示列表的大小(N)。 输入的第二行由 N 个空格分隔的整数组成,表示列表的值
输出
打印 N 个以空格分隔的整数,使得列表的所有奇数都排在偶数之后
示例
示例输入
8
10 98 3 33 12 22 21 11样本输出
10 98 12 22 3 33 21 11
解决方案 1-
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a[n];
for(int i=0; i<n; i++)
cin>>a[i];
int p1=0, p2= n-1;
while(p1 < p2){
while(a[p1]%2 == 0 and p1<p2)
p1++;
while(a[p2]%2 != 0 and p1<p2)
p2--;
if(p1 < p2){
swap(a[p1], a[p2]);
p1++;
p2--;
}
}
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
return 0;
}
解决方案 2-
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int arr[n];
for(int i=0;i<n;i++){
cin>>arr[i];
}
for(int i=0;i<n;i++){
if(arr[i]%2==0)
cout<<arr[i]<<" ";
}
for(int i=0;i<n;i++){
if(arr[i]%2!=0)
cout<<arr[i]<<" ";
}
return 0;
}
【问题讨论】:
-
两者都无效,
cin>>n; int arr[n];不是标准 C++。 -
@JosephLarson 确实,任何版本的 C++ 都不支持 VLA。
-
澄清您对“最佳”的定义。您是在谈论内存中的最佳大小吗?最佳性能?最佳可读性?最佳稳健性?最佳的维护便利性?问题太多,时间太少了。
-
您可能想做的是查看std::partition。正如您在可能的实现中看到的那样,只需要一个循环。
-
@JosephLarson 是的,N3690 包含对此的建议,但最终没有成功。请参阅 this answer 和 this overview。所以这篇文章只是链接到了不正确的、未完成的标准版本。