完美偶数计数
问题描述
小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
思路
我们需要在一个数组中找出满足以下两个条件的数:
- 该数是偶数。
- 该数在给定的区间
[l, r]之间。
数据结构选择
由于我们只需要遍历数组并检查每个元素是否满足条件,因此不需要额外的复杂数据结构。直接使用数组即可。
算法步骤
-
初始化计数器:用于记录满足条件的数的个数。
-
遍历数组:对数组中的每个元素进行以下检查:
- 检查该元素是否为偶数。
- 检查该元素是否在区间
[l, r]之间。
-
更新计数器:如果元素满足上述两个条件,则将计数器加一。
-
返回计数器:遍历结束后,返回计数器的值。
代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int solution(int n, int l, int r, std::vector<int>& a) {
int count = 0;
// 遍历数组中的每个数字
for (int i = 0; i < n; ++i) {
// 检查是否是偶数并且在[l, r]区间内
if (a[i] % 2 == 0 && a[i] >= l && 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;
}
小S的倒排索引
问题描述
小S正在帮助她的朋友们建立一个搜索引擎。为了让用户能够更快地找到他们感兴趣的帖子,小S决定使用倒排索引。倒排索引的工作原理是:每个单词都会关联一个帖子ID的列表,这些帖子包含该单词,且ID按从小到大的顺序排列。
例如,单词“夏天”可能出现在帖子1、帖子3和帖子7中,那么这个单词的倒排链就是 [1, 3, 7]。如果用户想同时找到包含“夏天”和“海滩”的帖子,小S需要找出两个倒排链的交集,且将结果按照从大到小的顺序输出。现在,给定两个单词的倒排链数组 a 和 b,请你帮助小S找出同时包含这两个单词的帖子ID,并按从大到小的顺序返回结果。
测试样例
样例1:
输入:
a = [1, 2, 3, 7], b = [2, 5, 7]
输出:[7, 2]
样例2:
输入:
a = [1, 4, 8, 10], b = [2, 4, 8, 10]
输出:[10, 8, 4]
样例3:
输入:
a = [3, 5, 9], b = [1, 4, 6]
输出:[]
样例4:
输入:
a = [1, 2, 3], b = [1, 2, 3]
输出:[3, 2, 1]
问题理解
你需要找出两个有序数组 a 和 b 的交集,并将结果按从大到小的顺序输出。
数据结构选择
由于数组是有序的,我们可以使用双指针法来高效地找出交集。
算法步骤
-
初始化指针:分别在数组
a和b的起始位置设置两个指针i和j。 -
遍历数组:
- 如果
a[i]等于b[j],则将该元素加入结果集,并同时移动两个指针。 - 如果
a[i]小于b[j],则移动i指针。 - 如果
a[i]大于b[j],则移动j指针。
- 如果
-
结果排序:由于我们需要按从大到小的顺序输出结果,可以在加入结果集时直接使用一个栈来存储结果,这样栈顶元素就是最大的。
代码
def solution(a, b):
# 初始化两个指针,指向a和b的开头
i, j = 0, 0
result = []
# 双指针遍历两个列表
while i < len(a) and j < len(b):
if a[i] == b[j]:
result.append(a[i]) # 找到交集元素,加入结果
i += 1
j += 1
elif a[i] < b[j]:
i += 1 # a中的元素小于b中的元素,移动a的指针
else:
j += 1 # b中的元素小于a中的元素,移动b的指针
# 将结果反转,按从大到小输出
return result[::-1]
if __name__ == '__main__':
print(solution([1, 2, 3, 7], [2, 5, 7]) == [7, 2])
print(solution([1, 4, 8, 10], [2, 4, 8, 10]) == [10, 8, 4])
print(solution([3, 5, 9], [1, 4, 6]) == [])
print(solution([1, 2, 3], [1, 2, 3]) == [3, 2, 1])