【问题标题】:Removing odd numbers from an array从数组中删除奇数
【发布时间】:2019-09-04 04:20:42
【问题描述】:

我正在尝试从数组中删除奇数,但我不允许创建新数组来存储新值。

所以,如果我有arr[1,2,3,4,5,6,7,8,9] 那么我需要它是 arr[2,4,6,8] 以便 arr[0] 将是 2 而不是 1。

如果不创建一个新数组来存储值,然后将其反馈回具有新值的原始数组,我似乎无法删除偶数。

如果 arr[i] = 0 是奇数,我尝试将其设为奇数,但我无法删除 0 并将其替换为下一个偶数。

到目前为止,我有这个:

void removeOdd(int arr[], int& arrSize){
    int i, j = 0;
    int temp;
    int newArrSize;
    for(i = 0, newArrSize = arrSize; i < arrSize; i++){
        if(arr[i] % 2 != 0){
            arr[i] = 0;
        }
    }
    arrSize = newArrSize;
}

【问题讨论】:

  • 旁注:更喜欢int newArrSize; 而不是for(i = 0, newArrSize = arrSize;...。看你搞笑的人会更少。请注意,这不会更好,因为设置后 newArrSize 没有任何变化。

标签: c++ arrays algorithm


【解决方案1】:
// Moves all even numbers into the beginning of the array in their original order
int removeOdd(int arr[], int arrSize) {
    int curr = 0; // keep track of current position to insert next even number into
    for (int i = 0; i < arrSize; ++i) {
        if (arr[i] % 2 == 0) {
            arr[curr++] = arr[i];
        }
    }
    return curr;
}

int main() {
    int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
    int newSize = removeOdd(arr, 10);
    for (int i = 0; i < newSize; ++i) {
        std::cout << arr[i] << " ";
    }
}

0 2 4 6 8

你可能想使用std::vector:

void removeOdd(std::vector<int>& arr) {
    int curr = 0;
    for (int i = 0; i < (int)arr.size(); ++i) {
        if (arr[i] % 2 == 0) {
            arr[curr++] = arr[i];
        }
    }
    arr.resize(curr);
}

int main() {
    std::vector<int> arr = { 0,1,2,3,4,5,6,7,8,9 };
    removeOdd(arr);
    for (int number : arr) {
        std::cout << number << " ";
    }
}

【讨论】:

  • 我问我是否可以使用矢量,我们也不允许:/
  • @Knarz 所以,我提供了两个选项。如果是数组,您需要返回新的大小。
  • 好的,谢谢!它最终使用了第一个选项!刚刚将事件移到了前面!
【解决方案2】:

通常(除非这是某种家庭作业),您应该使用 &lt;algorithm&gt; 标头中的算法。

使用std::remove_ifstd::vectorerase 成员函数,您可以用更少的代码完成您想要的:

std::vector<int> vec{ 1,2,3,4,5,6,7,8,10 };
vec.erase(std::remove_if(std::begin(vec), std::end(vec), [](auto const& i) {
    return i % 2 != 0;
}), std::end(vec));

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-02
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2013-10-28
    相关资源
    最近更新 更多