【问题标题】:how to put all odd number in left an even number in right on array如何将所有奇数放在左侧,将偶数放在右侧的数组中
【发布时间】:2021-06-15 13:41:47
【问题描述】:

给定两个大小分别为 N 和 M 的整数 A 和 B 数组。用四个参数编写一个名为 MIX 的函数,它将生成并返回名为 C 的第三个数组,从而遵循以下顺序。

-从左到右的所有奇数A都从左到右复制到C中。 - A 从左到右的所有 eve 数都从右到左复制到 C 中。 - 从左到右的所有奇数 B 都从左到右复制到 C 中。 -从左到右的所有偶数B都从右到左复制到C中。

示例 #1

输入

6 7
3 2 1 7 6 3
9 3 5 6 2 8 10

输出

3 1 7 3 9 3 5 10 8 2 6 6 2

c++代码

#include<iostream> 
#include<vector>
#include<algorithm>
using namespace std;
vector<int> insert (vector<int> &a, vector<int> &b)
{
  vector<int>c;

for (int i = 0 ;i < a.size() ; i ++) 
{
  if (a[i]%2!=0 )
    c.push_back(a[i]);
  else 

    c.insert(c.begin(),a[i]);
}
      for(int j = 0; j < b.size() ; j++)
  {
 if (b[j]%2!=0 )

       c.push_back(b[j]);    
  else 
  
        c.insert(c.begin(),b[j]);
      }
return c;
}
int main (void){
  int as;
  int bs;
  cin>>as>>bs;
  vector<int> a(as);  
  vector<int> b(bs);
  for(int i =0 ; i <a.size();i++)
  {
    cin>>a[i];
  }
  for(int k =0 ; k<b.size();k++)
  {
    cin>>b[k];
  }  
  vector<int> c=insert(a,b);
  for(int & v: c)
        cout<<v<<"    ";
  return 0;
}

【问题讨论】:

  • 首先欢迎来到 Stack Overflow。请阅读the help pages,接受SO tour,阅读How to Ask,以及this question checklist。请了解如何创建minimal reproducible example
  • 至于您的问题,您所做的基本上是 排序 数组,但不是使用值之间的相对顺序,而是只检查奇数/偶数。因此,您需要对数组进行排序,并使用奇数“小于”偶数的排序函数。
  • 欢迎您!不错的运动。但是我们不想通过为您提供现成的解决方案来破坏您编码的乐趣。请自行尝试并返回一些代码,看看我们能做些什么来支持你:-)
  • @Someprogrammerdude 会不会更像是过滤(即copy_if 对 A 使用前向迭代器,对 B 使用后向迭代器,在这两种情况下都指向后向插入器)?
  • @Christophe 可能我错过了关于来自两个不同来源的数据的部分。如果所有数据都已经收集到一个容器中,并且就地修改它,我的解决方案会更合适。

标签: c++ arrays sorting arraylist arr


【解决方案1】:
#include <vector>
#include <algorithm>

static bool is_odd(int n) { return n % 2 == 1; }

// Let a == {3, 2, 1, 7, 6, 3} as example
static std::vector<int>::iterator order_odds_first_and_reverse_evens(std::vector<int> &a) {
    // a == {3, 2, 1, 7, 6, 3}
    const auto first_even{stable_partition(a.begin(), a.end(), is_odd)};
    // a == {3, 1, 7, 3, 2, 6}
    reverse(first_even, a.end());
    // a == {3, 1, 7, 3, 6, 2}
    return first_even;
    // first_even points to 6
}

std::vector<int> insert(std::vector<int> &a, std::vector<int> &b) {
    // b == {9, 3, 5, 6, 2, 8, 10}
    order_odds_first_and_reverse_evens(b);
    // b == {9, 3, 5, 10, 8, 2, 6}

    // a == {3, 2, 1, 7, 6, 3}
    a.insert(
        order_odds_first_and_reverse_evens(a), // a == {3, 1, 7, 3, 6, 2}
        b.begin(), 
        b.end()
    );
    // a == {3, 1, 7, 3, 9, 3, 5, 10, 8, 2, 6, 6, 2}
    return a;
}

【讨论】:

  • 也许添加一些 cmets 来解释发生了什么。
【解决方案2】:
#include<iostream>
#include<vector>
using namespace std;

int * MIX(int *A,int n,int *B,int m){
int len = n+m;
int* C = new int[len];
vector<int>odd;
vector<int>even;
for(int i = 0; i < n ; i++){
    if(A[i]%2==0)
        even.insert(even.begin(), A[i]);
    else
        odd.push_back(A[i]);
}
for(int j = 0; j < m ; j++){
    if(B[j]%2==0)
        even.insert(even.begin(), B[j]);
    else
        odd.push_back(B[j]);
}
int k = 0;
for(k; k < odd.size(); k++)
{
    C[k] = odd[k];
}
for(int l = 0 ; l < even.size(); l++)
{
    C[l+k] = even[l];
}

return C;


}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    相关资源
    最近更新 更多