完美偶数计数
问题描述
小C定义了一个“完美偶数”。一个正整数 xx 被认为是完美偶数需要满足以下两个条件:
- xx 是偶数;
- xx 的值在区间 [l,r][l,r] 之间。
现在,小C有一个长度为 nn 的数组 aa,她想知道在这个数组中有多少个完美偶数。
测试样例
样例1:
输入:
n = 5,l = 3,r = 8,a = [1, 2, 6, 8, 7]
输出:2
样例2:
输入:
n = 4,l = 10,r = 20,a = [12, 15, 18, 9]
输出:2
样例3:
输入:
n = 3,l = 1,r = 10,a = [2, 4, 6]
输出:3
先看看思路:
-
理解问题:你需要计算数组
a中有多少个数是偶数,并且这些偶数的值在区间[l, r]之间。 -
遍历数组:你可以使用一个循环来遍历数组
a中的每一个元素。 -
检查条件:对于每一个元素,检查它是否是偶数,并且是否在区间
[l, r]之间。 -
计数器:使用一个计数器来记录满足条件的元素个数。
那么有了思路,如何用代码实现呢?这里贴一个C++的实现:
#include <iostream>
#include <vector>
using namespace std;
int solution(int n, int l, int r, vector<int>& a) {
// 初始化计数器
int count = 0;
// 遍历数组中的每一个元素
for (int i = 0; i < n; ++i) {
// 检查当前元素是否是偶数,并且是否在区间 [l, r] 之间
if (a[i] % 2 == 0 && l <= a[i] && a[i] <= r) {
// 如果是,增加计数器
count++;
}
}
// 返回计数器的值
return count;
}
int main() {
vector<int> a1 = {1, 2, 6, 8, 7};
cout << (solution(5, 3, 8, a1) == 2) << endl;
vector<int> a2 = {12, 15, 18, 9};
cout << (solution(4, 10, 20, a2) == 2) << endl;
vector<int> a3 = {2, 4, 6};
cout << (solution(3, 1, 10, a3) == 3) << endl;
}
贴个详细解析的版本:
-
solution函数功能:- 这个函数的主要目的是在给定的整数数组
a中,统计满足两个条件的元素个数。条件一是元素为偶数,条件二是元素的值在区间[l, r]内。 - 它接受四个参数:
n表示数组a的元素个数,l和r定义了区间范围,a是要处理的整数数组。 - 在函数内部,通过一个
for循环遍历数组的每个元素,对于每个元素进行条件判断,如果满足条件就增加计数器count的值。
- 这个函数的主要目的是在给定的整数数组
-
main函数功能:- 这里主要是对
solution函数进行测试。 - 首先定义了三个不同的数组
a1、a2和a3,并分别初始化了一些值。 - 然后针对每个数组,调用
solution函数,并将计算结果与预期结果进行比较,通过cout输出比较结果(如果结果与预期相等输出1,否则输出0)。这样可以直观地看到函数在不同输入情况下的计算是否正确。
一、思路分析
- 这里主要是对
-
目标明确
- 要实现的功能是在给定的整数数组中,统计出值为偶数且位于指定区间
[l, r]内的元素个数。
- 要实现的功能是在给定的整数数组中,统计出值为偶数且位于指定区间
-
遍历数组
- 采用循环遍历数组的方式,依次检查每个元素。因为需要对数组中的每一个元素进行判断,所以循环是必不可少的。这里选择
for循环,从数组的第一个元素开始(索引为0),直到最后一个元素(索引为n - 1,其中n是数组的长度)。
- 采用循环遍历数组的方式,依次检查每个元素。因为需要对数组中的每一个元素进行判断,所以循环是必不可少的。这里选择
-
条件判断
- 对于每个元素,需要进行两个条件的判断。一是判断元素是否为偶数,通过对元素取余
% 2是否等于0来确定。二是判断元素是否在指定区间内,即判断是否大于等于l且小于等于r。只有当这两个条件同时满足时,才将计数器增加1。
- 对于每个元素,需要进行两个条件的判断。一是判断元素是否为偶数,通过对元素取余
二、图解说明
(一)整体流程
假设我们有一个数组a = {3, 4, 5, 6, 7},l = 4,r = 6。
-
首先,程序进入
main函数,开始对solution函数进行调用测试。 -
进入
solution函数后,初始化计数器count = 0。 -
开始
for循环遍历数组a:- 第一次循环,
i = 0,此时a[0] = 3。判断3 % 2!= 0(不满足偶数条件),所以不执行count++。 - 第二次循环,
i = 1,a[1] = 4。判断4 % 2 == 0(满足偶数条件)且4 >= 4 && 4 <= 6(满足区间条件),执行count++,此时count = 1。 - 第三次循环,
i = 2,a[2] = 5。判断5 % 2!= 0,不执行count++。 - 第四次循环,
i = 3,a[3] = 6。判断6 % 2 == 0且6 >= 4 && 6 <= 6,执行count++,此时count = 2。 - 第五次循环,
i = 4,a[4] = 7。判断7 % 2!= 0,不执行count++。
- 第一次循环,
-
循环结束后,返回
count的值,在main函数中输出结果。
(二)条件判断细节
-
偶数判断
- 当元素对
2取余等于0时,如4 % 2 = 0和6 % 2 = 0,说明该元素是偶数,满足第一个条件。
- 当元素对
-
区间判断
- 对于元素
4,因为4 >= 4 && 4 <= 6,满足区间[4, 6]的条件。对于元素6,同样6 >= 4 && 6 <= 6满足区间条件。而3和5、7不满足区间条件。
- 对于元素
三、代码详解
-
函数定义
-
int solution(int n, int l, int r, vector<int>& a):- 函数名为
solution,返回值类型为int,表示最终统计的满足条件的元素个数。 - 接受四个参数,
n表示数组a的元素个数,l和r是指定的区间边界,vector<int>& a表示传入的整数数组,这里使用引用传递可以避免数组的拷贝,提高效率。
- 函数名为
-
-
计数器初始化
int count = 0;:在函数内部定义一个整型变量count并初始化为0,用于记录满足条件的元素个数。
-
循环遍历数组
-
for (int i = 0; i < n; ++i):- 这是一个
for循环结构。int i = 0初始化循环变量i为0,表示从数组的第一个元素开始。i < n是循环条件,只要i小于数组的元素个数n,循环就会继续执行。++i表示每次循环结束后i的值增加1,以便遍历下一个元素。
- 这是一个
-
-
条件判断与计数
-
if (a[i] % 2 == 0 && l <= a[i] && a[i] <= r):a[i] % 2 == 0判断当前元素a[i]是否为偶数。l <= a[i] && a[i] <= r判断当前元素是否在区间[l, r]内。只有当这两个条件同时为真时,才执行count++,将计数器的值增加1。
-
-
返回结果
return count;:循环结束后,函数返回计数器count的值,这个值就是满足条件的元素个数。
-
主函数测试
-
在
main函数中:- 首先定义了三个测试数组
a1、a2和a3,并分别初始化了不同的值。 - 然后针对每个数组调用
solution函数,并将返回结果与预期结果进行比较,通过cout输出比较结果。例如,cout << (solution(5, 3, 8, a1) == 2) << endl;中,solution(5, 3, 8, a1)计算数组a1中满足条件的元素个数,然后将其与2进行比较,如果相等则输出1,否则输出0。这有助于验证solution函数在不同输入情况下的正确性。
- 首先定义了三个测试数组
-