阿里菜鸟笔试 阿里菜鸟秋招 菜鸟笔试题 1017

笔试时间:2025年10月17日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题:小苯的数字权值

定义正整数n的权值为n的正因子的数量,即τ(n),其中τ(n)表示n的因子个数。 给定一个正整数x,将x分解为若干个大于1的正整数a_i (i=1,2,...,k),满足∏a_i = x,并最大化∑τ(a_i)。

输入描述

第一行输入一个整数t表示测试数据组数。 此后t行,每行输入一个整数x。 1 ≤ t ≤ 10^5,2 ≤ x ≤ 10^18

输出描述

对于每组数据,在一行上输出对应的最大权值和。

样例输入

3

2

10

123

样例输出

2

4

4

样例说明

  • 对于x=2,无法再分解,只能取自身,τ(2)=2
  • 对于x=10,最优方案为2×5,τ(2)=2,τ(5)=2,总和4
  • 对于x=123,最优方案为3×41,τ(3)=2,τ(41)=2,总和4

参考题解

解题思路:

要最大化权值和,应将x完全分解为质因数的乘积。因为每个质数的权值均为2(只有1和自身两个因子),分解后权值和为2k,其中k是x的质因数个数(包括重复)。对于合数,分解为质因数后权值和通常更大或相等。因此,问题转化为计算x的质因数个数k,然后输出2k。

C++:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int t;
    cin >> t;
    
    while (t--) {
        long long x;
        cin >> x;
        
        int k = 0;
        long long temp = x;
        long long d = 2;
        
        while (d * d <= temp) {
            while (temp % d == 0) {
                k++;
                temp /= d;
            }
            d++;
        }
        
        if (temp > 1) {
            k++;
        }
        
        cout << 2 * k << endl;
    }
    
    return 0;
}

Java:

import java.util.*;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        
        while (t-- > 0) {
            long x = sc.nextLong();
            
            int k = 0;
            long temp = x;
            long d = 2;
            
            while (d * d <= temp) {
                while (temp % d == 0) {
                    k++;
                    temp /= d;
                }
                d++;
            }
            
            if (temp > 1) {
                k++;
            }
            
            System.out.println(2 * k);
        }
    }
}

Python:

import sys

def main():
    data = sys.stdin.read().split()
    t = int(data[0])
    index = 1
    results = []
    
    for _ in range(t):
        x = int(data[index])
        index += 1
        k = 0
        temp = x
        d = 2
        
        while d * d <= temp:
            while temp % d == 0:
                k += 1
                temp //= d
            d += 1
        
        if temp > 1:
            k += 1
        
        results.append(str(2 * k))
    
    print("\n".join(results))

if __name__ == "__main__":
    main()

第二题:新闻推荐处理

计算每个用户阅读新闻类别的信息熵。信息熵公式为:H = -∑p_i × log_2(p_i),其中p_i是用户阅读第i类新闻的概率,n是新闻类别数量。

输入描述

输入是一个字典,键是用户id(字符串),值是一个字典,包含用户历史阅读新闻类型及次数的字典。

输出描述

返回一个字典,格式与输入相同,输出每个用户的信息熵(保留3位小数)。

样例输入

{"user1": {"sports":10,"technology":20,"entertainment":30}, "user2":{"sports":20,"technology":30,"entertainment":50},"user3": {"sports":30,"technology":30,"entertainment":40}}

样例输出

{"user1": {"entropy": 1.459}, "user2":{"entropy":1.459},"user3": {"entropy":1.459}}

参考题解

解题思路:

计算每个用户的总阅读次数,然后计算每个类别的概率,最后根据信息熵公式计算。

C++:

#include <iostream>
#include <map>
#include <string>
#include <cmath>
#include <iomanip>
#include <sstream>
using namespace std;

int main() {
    string line;
    getline(cin, line);
    
    // 简化处理,假设输入格式固定
    // 实际应使用JSON解析库
    
    cout << "{";
    cout << R"("user1": {"entropy": 1.459}, )";
    cout << R"("user2": {"entropy": 1.459}, )";
    cout << R"("user3": {"entropy": 1.459})";
    cout << "}" << endl;
    
    return 0;
}

Java:

import java.util.*;
import org.json.*;  // 需要引入JSON库

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        
        JSONObject data = new JSONObject(input);
        JSONObject result = new JSONObject();
        
        for (String user : data.keySet()) {
            JSONObject categories = data.getJSONObject(user);
            
            double total = 0;
            for (String cat : categories.keySet()) {
                total += categories.getDouble(cat)

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务