C++程序 统计数组中的正数和负数
给出大小为N的整数数组 arr ,我们的任务是在数组中找到正数和负数的数量。
示例:
输入: arr[] = [-9,7,-5,3,2]
输出: 正数个数=3,负数个数=2
输入: arr[] = [5,4,-2,-1,-7]
输出: 正数个数=2,负数个数=3
方法:
- 逐个遍历数组中的元素。
- 使用条件元素 >=0 来查找元素的正负。 如果满足条件,则增加 p_count 值。
- 从所有元素的总数中减去 p_count 以获取数组中负数的数量。
- 打印正数和负数的数量。
示例:
// C++ program to find the count of positive
// and negative integers in an array
#include<bits/stdc++.h>
using namespace std;
//function to calculate the positive numbers in an array
int CountPositive(int arr[],int n){
int p_count = 0;
for(int i =0;i<n;i++){
if (arr[i]>=0){
p_count++;
}
}
return p_count;
}
//Function to print the array
void printArray(int arr[],int n){
cout<<"Array: ";
for(int i = 0; i<n; i++){
cout<<arr[i]<<" ";
}
cout<<"\n";
}
// Driver program
int main(){
int arr[] = {-9,7,-5,3,2 };
int n;
n = sizeof(arr) / sizeof(arr[0]);
printArray(arr, n);
int p_count = CountPositive(arr,n);
cout<<"正数个数 = "<<p_count<<", ";
cout<<"负数个数 = "<<n - p_count;
return 0;
}
输出:
Array: -9 7 -5 3 2
正数个数 = 3,负数个数 = 2
时间复杂度: O(n)
辅助空间: O(1)
方法2: 递归
// C++ program to find the count of positive
// and negative integers in an array
#include<bits/stdc++.h>
using namespace std;
//Defining recursive function to calculate no of positive in an array
int CountPositive(int begin,int arr[],int n,int pos_count){
if (begin==n) //base condition
return pos_count;
if (arr[begin]>=0) //checking whether no is positive or not
pos_count++;
return CountPositive(begin+1,arr,n,pos_count); //recursive calling
}
//Function to print the array
void printArray(int arr[],int n){
cout<<"Array: ";
for(int i = 0; i<n; i++){
cout<<arr[i]<<" ";
}
cout<<"\n";
}
// Driver program
int main(){
int arr[] = {-9,7,-5,3,2 };
int n;
n = sizeof(arr) / sizeof(arr[0]);
printArray(arr, n);
int p_count = CountPositive(0,arr,n,0); //calling recursive function
cout<<"正数个数 = "<<p_count<<", ";
cout<<"负数个数 = "<<n - p_count;
return 0;
}
输出:
Array: -9 7 -5 3 2
正数个数 = 3,负数个数 = 2
时间复杂度: O(n)
辅助空间: O(n)
另一种方法:使用C ++标准模板库(STL)和 ‘count_if()’函数:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int arr[] = {-9,7,-5,3,2};
int n = sizeof(arr) / sizeof(arr[0]);
cout<<"Array: ";
for(int i = 0; i<n; i++){
cout<<arr[i]<<" ";
}
cout<<"\n";
// 使用 count_if 函数来计算正数和负数的个数
int pos_count = count_if(arr, arr + n, [](int x) { return x >= 0; });
int neg_count = count_if(arr, arr + n, [](int x) { return x < 0; });
// 输出个数
cout << "Count of Positive elements ="<< pos_count<<", ";
cout << "Count of Negative elements = " << neg_count;
return 0;
}
输出
Array: -9 7 -5 3 2
Count of Positive elements =3, Count of Negative elements = 2
时间复杂度:O(n)
辅助空间:O(n)
另一种高效的方法(使用 二分查找 ):
- 如果数组未排序,则先对数组进行排序。
- 使用二分搜索在排序数组中获取负数的最后一个索引。
- 在数组中将索引初始化为最后一个负数的索引 -1 ,因为,如果数组中没有负数,则将返回 -1 作为最后一个负数的索引。
- 负数的计数将是 “索引 +1”,因为我们使用的是基于0的索引。
- 正数的计数将是“数组中的总数 – 数组中负数的数量”。
- 输出最终答案。
下面是上述方法的实现:
// C++实现上述方法
#include <bits/stdc++.h>
using namespace std;
// 查找排序数组中负数的最后一个索引的函数
int BinarySearch(int *arr, int n)
{
int l = 0, r = n-1, index = -1;//最初将索引初始化为-1
while(l <= r)
{
int mid = (l + r) / 2;
//如果arr[mid]为负数,则我们不会在范围[l,mid-1]中搜索
//因为负数的最后一个索引在排序数组的范围[mid,r]中。
if(arr[mid]<0)
{
l = mid + 1;
index=mid;//每次在排序数组中更新最右边的负数索引
}
else
{
r = mid - 1;
}
}
//返回负数的最后一个索引
return index;
}
//打印数组元素的函数
void printArray(int *arr,int n)
{
cout<<"Array: ";
for(int i = 0; i<n; i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
}
//主函数
int main()
{
int arr[] = {-9,7,-5,3,2 };
int n = sizeof(arr) / sizeof(arr[0]);
printArray(arr, n);
// 对数组进行排序,以便进行二分查找
sort(arr,arr+n);
int neg_count = BinarySearch(arr, n)+1;
int pos_count = n - neg_count;
// 输出计数
cout << "Count of Positive elements = "<< pos_count<<", ";
cout << "Count of Negative elements = " << neg_count<<endl;
return 0;
}
// 本代码由nikhilsainiofficial546贡献```
输出
Array: -9 7 -5 3 2
Count of Positive elements = 3, Count of Negative elements = 2
时间复杂度: O(n*log 2 n)
辅助空间: O(1)