小红书笔试 小红书笔试题 0820

笔试时间:2025年8月20日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题:小红薯的好数

小红薯定义一个点赞数n为好数,当且仅当这个数的所有本质不同质因子之和为奇数。例如,12的本质不同质因子为{2,3},且2+3=5为奇数,因此12是好数。特别地,当n=1时无质因子,本质不同质因子之和视为0。现在,首页上有好多Plog,请帮助小红薯判断每条Plog的点赞数都是不是好数。

输入描述

每个测试文件均包含多组测试数据。第一行输入一个整数代表数据组数T,每组测试数据描述如下:

第一行输入一个整数,表示Plog的点赞数。

输出描述

对于每组测试数据,新起一行,如果点赞数是好数,输出YES,否则输出NO。

样例输入

3

2

12

样例输出

NO

YES

YES

说明:对于样例数据,2的本质不同质因子只有2,而2不是奇数,因此不是好数

参考题解

一个数x需要寻找其质数因子,只需要寻找到sqrt(x),从小到大枚举2到sqrt(x)的每个数,如果当前x对枚举值取模为0,则代表是他的质因子,找出所有不同质因子后求和输出结果即可。

C++:

#include <bits/stdc++.h>
using namespace std;

long long get_sum_distinct_prime_factors(long long number) {
    if (number <= 1) return 0;
    long long total = 0;

    if (number % 2 == 0) {
        total += 2;
        while (number % 2 == 0) number /= 2;
    }
    for (long long i = 3; i <= number / i; i += 2) {
        if (number % i == 0) {
            total += i;
            while (number % i == 0) number /= i;
        }
    }
    if (number > 1) total += number;
    return total;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    if (!(cin >> t)) return 0;
    while (t--) {
        long long n;
        cin >> n;
        long long s = get_sum_distinct_prime_factors(n);
        if (s % 2 == 1) cout << "YES\n";
        else cout << "NO\n";
    }
    return 0;
}

Java:

import java.io.*;
import java.util.*;

public class Main {
    // 计算“不同素因子之和”
    static long get(long number) {
        if (number <= 1) return 0L;
        long total = 0L;

        if (number % 2 == 0) {
            total += 2;
            while (number % 2 == 0) number /= 2;
        }
        for (long i = 3; i <= number / i; i += 2) {
            if (number % i == 0) {
                total += i;
                while (number % i == 0) number /= i;
            }
        }
        if (number > 1) total += number;
        return total;
    }

    // 简单快速输入
    static class FastScanner {
        private final InputStream in;
        private final byte[] buffer = new byte[1 << 16];
        private int ptr = 0, len = 0;
        FastScanner(InputStream is) { in = is; }
        private int read() throws IOException {
            if (ptr >= len) {
                len = in.read(buffer);
                ptr = 0;
                if (len <= 0) return -1;
            }
            return buffer[ptr++];
        }
        long nextLong() throws IOException {
            int c; do { c = read(); } while (c <= 32);
            int sign = 1;
            if (c == '-') { sign = -1; c = read(); }
            long x = 0;
            while (c > 32) {
                x = x * 10 + (c - '0');
                c = read();
            }
            return x * sign;
        }
        int nextInt() throws IOException { return (int) nextLong(); }
    }

    public static void main(String[] args) throws Exception {
        FastScanner fs = new FastScanner(System.in);
        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
        int t = fs.nextInt();
        for (int k = 0; k < t; k++) {
            long n = fs.nextLong();
            long s = get(n);
            out.println((s & 1L) == 1L ? "YES" : "NO");
        }
        out.flush();
    }
}

Python:

import math

def get(number):
    if number <= 1:
        return0
    total = 0
    if number % 2 == 0:
        total += 2
        while number % 2 == 0:
            number //= 2
    i = 3
    while i * i <= number:
        if number % i == 0:
            total += i
            while number % i == 0:
                number //= i
        i += 2
    if number > 1:
        total += number
    return total

def main():
    import sys
    data = sys.stdin.read().split()
    t = int(data[0])
    index = 1
    for _ in range(t):
        n = int(data[index])
        index += 1
        s = get(n)
        if s % 2 == 1:
            print("YES")
        else:
            print("NO")

if __name__ == "__main__":
    main()

第二题

在小红书首页的两列中,小红喜欢独爱单一列。她将第一列每条的点赞状态从上到下用一个进制字符串s = (s1, s2, …, sn)表示,其中:字符si = '1'表示用户已点赞第i条;字符si = '0'表示用户未点赞第i条。小红定义一轮点赞行为如下:选择索引对1 ≤ l ≤ r ≤ n;从第l条Plog开始,到第r条Plog结束,进行一次重复点赞行为。这会使得原本未点赞的Plog变为已点赞,原本已点赞的Plog变为未点赞。小红希望使得这一列Plog的点赞状态调整为一个回文串,即第一条和最后一条Plog的点赞状态相同,第二条和倒数第二条的Plog点赞状态相同,以此类推。请计算她最少需要进行的点赞行为轮数。

输入描述

每个测试文件均包含多组测试数据。第一行输入一个整数T (1 ≤ T ≤ 10^4)代表数据组数,每组测试数据描述如下:第一行输入一个整数n (1 ≤ n ≤ 2 × 10^5),表示数量

第二行输入一个长度为n、由字符'0'和'1'构成的字符串s,表示点赞状态。除此之外,保证单个测试文件的n之和不超过2 × 10^5。

输出描述

对于每一组测试数据,新起一行,输出一个整数,代表使字符串s成为回文串所需的最少点赞行为轮数。

样例输入

2

2

01

3

010

样例输出

1

0

参考题解

最终期望组成一个回文字符串,那么首先将字符串分为前后两半,对应位置如果不同,则代表需要进行反转。把不同的位置标记为1,相同的位置标记为0,会得到一个新的01字符串,问题就简化为寻找这个字符串中有多少个连续的1子段,最后根据子段数量输出结果即可。

C++:

#include <bits/stdc++.h>
using namespace std;

// 统计二值数组中连续为 1 的段数
int count_segments(const vector<int>& arr) {
    if (arr.empty()) return 0;
    int cnt = 0;
    int current_value = arr[0];
    if (current_value == 1) cnt += 1;
    for (size_t i = 1; i < arr.size(); ++i) {
        int value = arr[i];
        if (value != current_value) {
            if (value == 1) cnt += 1;
            current_value = value;
        }
    }
    return cnt;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    if (!(cin >> t)) return 0;
    while (t--) {
        int length;
        string s;
        cin >> length >> s;

        if (length == 1) {
            cout << 0 << "\n";
            continue;
        }

        int half_length = length / 2;
        vector<int> arr;
        arr.reserve(half_length);
        for (int i = 0; i < half_length; ++i) {
            if (s[i] != s[length - 1 - i]) arr.push_back(1);
            else arr.push_back(0);
        }

        cout << count_segments(arr) << "\n";
    }
    return 0;
}

Java:

import java.io.*;
import java.util.*;

public class Main {

    // 统计二值数组中连续为 1 的段数
    static int countSegments(int[] arr) {
        if (arr.length == 0) return 0;
        int cnt = 0;
        int current = arr[0];
        if (current == 1) cnt++;
        for (int i = 1; i < arr.length; i++) {
            int v = arr[i];
            if (v != current) {
                if (v == 1) cnt++;
                current = v;
            }
        }
        return cnt;
    }

    // 简单高效输入
    static class FastScanner {
        private final InputStream in;
        private final byte[] buffer = new byte[1 << 16];
        private int ptr = 0, len = 0;
        FastScanner(InputStream is) { in = is; }
        private int read() throws IOException {
            if (ptr >= len) {
                len = in.read(buffer);
                ptr = 0;
                if (len <= 0) return -1;
            }
            return buffer[ptr++];
        }
        String next() throws IOException {
            StringBuilder sb = new StringBuilder();
            int c;
            do { c = read(); } while (c <= 32 && c != -1);
            while (c > 32 && c != -1) {
                sb.append((char)c);
                c = read();
            }
            return sb.toString();
        }
        int nextInt() throws IOException { return Integer.parseInt(next()); }
    }

    public static void main(String[] args) throws Exception {
        FastScanner fs = new FastScanner(System.in);
        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));

        int t = Integer.parseInt(fs.next());
        for (int _case = 0; _case < t; _case++) {
            int length = Integer.parseInt(fs.next());
            String s = fs.next();

            if (length == 1) {
                out.println(0);
                continue;
            }

            int half = length / 2;
            int[] arr = new int[half];
            for (int i = 0; i < half; i++) {
                arr[i] = (s.charAt(i) != s.charAt(length - 1 - i)) ? 1 : 0;
            }
            out.println(countSegments(arr));
     

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

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

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

全部评论

相关推荐

08-20 15:28
门头沟学院 Java
既然要挂我,就不要一直邀请我投递
投递字节跳动等公司10个岗位
点赞 评论 收藏
分享
阿里系笔试成绩互通吗?
投递阿里巴巴控股集团等公司10个岗位
点赞 评论 收藏
分享
昨天 18:00
南京大学 Java
本着精投的想法,8.10投了一批,8.26投了一批,目前为止共投递十余家互联网公司。一开始以为凭借自身双9+两段大厂的优势能够拿到大量的面试,需尽可能保证面试通过率。然而事实恰恰相反,给面的大部分都能通过,但70%的投递都石沉大海,拿到的面试寥寥无几...已投递:腾讯:8.25&nbsp;teg云架平存储一面,kpi面,全答后挂;9.3混元一面,官网流程变复试,尚未约二面淘天:暑期测评挂,秋招无缘阿里云:大概率同淘天,无消息阿里国际:9.4一面,未出结果蚂蚁:笔试完无动静虾皮:笔试ak,9.5约一面京东:8.19一面&nbsp;8.21二面&nbsp;9.2线下hr面后挂(一生黑,三场面试全部相谈甚欢结果hr面莫名其妙挂掉,至今问不到原因)快手、滴滴、联想、tme、pdd、百度、饿了么、阿里控股:简历评估中,无消息未投递但走了流程的:美团:转正流程中,结果未知字节:7.30hr主动把我暑期实习的简历捞起并加微信约面,8.7一面&nbsp;8.12二面&nbsp;8.19三面&nbsp;8.28hr面&nbsp;一周后意向不知道为啥今年秋招开的格外早,也不知道是因为投晚了还是自身简历确实缺少竞争力,大部分投了就是石沉大海。说来也是讽刺,唯一的意向来自于我并未投递的字节。挺感谢它的,要不是早早的主动拉我约面,我大概率也会在八月份才不紧不慢的开投,最后因为池子已满被卡在简历评估状态吧只能说秋招现在越来越癫了明明是9月初,居然连面试都寥寥无几,很多公司都像是招满了似的奉劝27的各位一定要早投+海投,至少先拿到保底意向,之后心态方面都会好很多
墨西哥大灰狼:HR看到🐗神简历直呼留不住,RD看到🐗神简历不敢发起面试了
投递美团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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