c++ - 我必须在数组末尾移动负元素,在某些情况下,如下面提供的,我得到的是垃圾谷而不是负元素
问题描述
#include <stdio.h>
#include <iostream>
using namespace std;
#define MAX 10
int main()
{
//code
int n,i=0,arr[MAX];
cin>>n;
for(int i =0;i<n;i++)
{
cin>>arr[i];
}
int j=1;
while(i<n&&j<=n)
{
if(arr[i]>0)
{
i++;
j++;
}
else if(arr[i]<0 && arr[j]>0)
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
i++;
}
else if(arr[i]<0 && arr[j]<0)
{
j++;
}
else
{
i++;
}
}
for(i=0;i<n;i++)
{
cout<<arr[i]<<" ";
}
return 0;
}
输入
4
-8
-6
7
8
输出
7 8 4196864 -6
我该如何解决这个问题?
我必须在数组末尾移动负元素,在某些情况下,如下面提供的,我得到的是垃圾值而不是负元素。有些案例正在起作用,但许多案例并不是特别是那些具有两个连续负面元素和以下正面元素的案例。
解决方案
这个答案是为任何使用算法函数寻找 C++ 解决方案的人发布的。完成工作的函数是std::partition:
#include <iostream>
#include <algorithm>
#define MAX 10
int main()
{
int n = 4;
int arr[MAX] = {-8, -6, 7, 8};
std::partition(arr, arr + n, [&](int val) { return val >= 0;});
for (int i = 0; i < n; ++i)
std::cout << arr[i] << " ";
}
输出:
8 7 -6 -8
如果要保持元素的原始相对顺序,可以使用std::stable_partition:
#include <iostream>
#include <algorithm>
#define MAX 10
int main()
{
int n = 4;
int arr[MAX] = {-8, -6, 7, 8};
std::stable_partition(arr, arr + n, [&](int val) { return val >= 0;});
for (int i = 0; i < n; ++i)
std::cout << arr[i] << " ";
}
输出:
7 8 -8 -6
推荐阅读
- linux - 使用 Unix 命令计算多个文件夹中的文件数
- asp.net - 在 Asp.net 中,“发布”Ajax 请求将“获取”
- javascript - 如何从 Firebase 获取数据到我的 React 应用程序
- python - 从另一个文件调用 Python 函数并使用该函数的 DF
- machine-learning - 我可以为数据框中的每一列使用新的缩放器对象吗?
- java - 如何将 UTC 日期和时间格式转换为时区时间格式?
- ios - 如何在 Swift(iOS) 中结合平移和旋转变换动画?
- bash - bash 脚本的迭代以并行运行
- c# - HTMLAgilityPack 和 C#,如何将提取的值从 HTML 显示到 TextBox - WinForms
- python-3.x - 如何在 Google Colab 笔记本中显示图像文件流?可能带有时间控制栏