如何从数组中删除奇数

问题描述 投票:3回答:4

看起来每次在阵列中连续有奇数三行。一个在中间不会被删除。我明白为什么会这样,但我不太清楚如何解决它。

这适用于C ++。

#include <iostream>

using namespace std;

void removeodd(int arr[],int& number)//{1,2,3,6,7,9,5,8};
{int count=0;
    for(int i=0; i<number; i++)
    {
        if(arr[i]%2!=0)
        {   
            int j=i+1;
            for(int k=i;k<number; k++)
        {
            arr[k]=arr[j]; 
            j++;
        }
            count++;
        }
    }
    number=number-count;
    for(int i=0; i<number; i++){
        cout<<arr[i]<<" ";
    }
}
int main(){
    int size=8;
    int ary[8]={1,2,3,6,7,9,5,8};

    removeodd(ary, size);

    return 0;
}

output of the code above is 2 6 9 8
c++
4个回答
0
投票

问题是你总是推进你的索引,即使你删除了一个奇数。因此,如果有两个奇数,则删除第一个并将索引移过第二个。要解决此问题,请在删除奇数时再次减小索引。所以在此之后:

count++;

还说这个:

i--;

你得到的输出是:

2 6 8


0
投票

在你的for循环..

删除值1时采用值。

在数组ary是{2,3,6,7,9,5,8}

但我的值是1,所以你没有检查值2是奇数。

所以修复循环检查所有值。


0
投票
  1. 可能会要求您显示偶数元素,而不是删除它们。您实际上无法从普通数组中删除元素。但是,您可以做的是将偶数元素从较高索引复制到较低索引并返回偶数元素的数量: 之前:1 2 3 4;大小是4 之后:2 4 3 4;新的“大小”是2(实际大小仍然是4
  2. 你的功能被称为removeodd,而不是removeodd_and_display_even。做你说的话。

解决方案(live):

#include <iostream>

int removeodd(int arr[], int arrsize)
{
  int di = 0; // di == destination index
  for (int si = 0; si < arrsize; ++si) // si == source index
    if (arr[si] % 2 == 0) // even number => copy it
      arr[di++] = arr[si]; // assign arr[si] to arr[di], then increment di
  return di; // "size" of new array
}

int main()
{
  int size = 8;
  int ary[8] = { 1,2,3,6,7,9,5,8 };

  int newsize = removeodd(ary, size);
  for (int i = 0; i < newsize; ++i)
    std::cout << ary[i] << ' ';

  return 0;
}

0
投票

你使用一系列基本类型(例如int)代替C ++容器使你自己变得困难,C ++容器包含成员函数,允许你.erase()你的数组中的任何元素。选择vector<int>将允许您以微不足道的方式移除奇数值。

例如,

#include <vector>
...
std::vector<int> arr {1,2,9,6,7,3,5,8};

将创建你的array作为vector<int>。作为矢量容器,您可以使用简单的迭代器简单地迭代矢量中的每个元素,从arr.begin()arr.end()。唯一需要注意的是,每次擦除后都必须重新验证迭代器,因为迭代器在容器更改时无效。要重新验证迭代器,只需指定.erase()操作的结果,例如:

    for (auto it = arr.begin(); it != arr.end();) { /* iterate vector */
        if (*it & 1u)           /* if value is odd */
            it = arr.erase(it); /* erase it saving/revalidating iter */
        else        /* otherwise */
            it++;               /* simply advance iter */
    }

将它放在一个输出原始arr的简短示例中,删除奇数,然后再次输出arr并删除奇数,您可以这样做:

#include <iostream>
#include <vector>

int main (void) {

    std::vector<int> arr {1,2,9,6,7,3,5,8};

    for (auto& v: arr)          /* output original vector contents */
        std::cout << " " << v;
    std::cout << '\n';

    for (auto it = arr.begin(); it != arr.end();) { /* iterate vector */
        if (*it & 1u)           /* if value is odd */
            it = arr.erase(it); /* erase it saving/revalidating iter */
        else        /* otherwise */
            it++;               /* simply advance iter */
    }

    /* output remaining even values */
    for (auto& v: arr)
        std::cout << " " << v;
    std::cout << '\n';
}

示例使用/输出

$ ./bin/vect_remove_odd
 1 2 9 6 7 3 5 8
 2 6 8

仔细看看,如果您有其他问题,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.