完美偶数计数&小S的倒排索引 | 豆包MarsCode AI刷题

41 阅读4分钟

完美偶数计数

问题描述

小C定义了一个“完美偶数”。一个正整数 xx 被认为是完美偶数需要满足以下两个条件:

  1. xx 是偶数;
  2. 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

思路

我们需要在一个数组中找出满足以下两个条件的数:

  1. 该数是偶数。
  2. 该数在给定的区间 [l, r] 之间。

数据结构选择

由于我们只需要遍历数组并检查每个元素是否满足条件,因此不需要额外的复杂数据结构。直接使用数组即可。

算法步骤

  1. 初始化计数器:用于记录满足条件的数的个数。

  2. 遍历数组:对数组中的每个元素进行以下检查:

    • 检查该元素是否为偶数。
    • 检查该元素是否在区间 [l, r] 之间。
  3. 更新计数器:如果元素满足上述两个条件,则将计数器加一。

  4. 返回计数器:遍历结束后,返回计数器的值。

代码

#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 的交集,并将结果按从大到小的顺序输出。

数据结构选择

由于数组是有序的,我们可以使用双指针法来高效地找出交集。

算法步骤

  1. 初始化指针:分别在数组 a 和 b 的起始位置设置两个指针 i 和 j

  2. 遍历数组

    • 如果 a[i] 等于 b[j],则将该元素加入结果集,并同时移动两个指针。
    • 如果 a[i] 小于 b[j],则移动 i 指针。
    • 如果 a[i] 大于 b[j],则移动 j 指针。
  3. 结果排序:由于我们需要按从大到小的顺序输出结果,可以在加入结果集时直接使用一个栈来存储结果,这样栈顶元素就是最大的。

代码

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])