后端面试通关笔记:从真题到思路(五)

斩获百度offer 最详细的面试真题与破解思路


文章目录


一、百度-C++开发-一面

八股文


算法题



代码如下(示例):

c 复制代码
class Solution {
public:
    string validIPAddress(string queryIP) 
    {
        if (queryIP.find('.') != string::npos) 
        {
            // 检查 IPv4
            if (isValidIPv4(queryIP)) return "IPv4";
        } 
        else if (queryIP.find(':') != string::npos) 
        {
            // 检查 IPv6
            if (isValidIPv6(queryIP)) return "IPv6";
        }
        return "Neither";
    }

private:
    bool isValidIPv4(const string& ip) 
    {
        vector<string> parts;
        stringstream ss(ip);
        string part;
        // 用 '.' 分割字符串
        while (getline(ss, part, '.')) 
        {
            parts.push_back(part);
        }
        if (parts.size() != 4) return false; // 必须是4部分

        for (const string& p : parts) 
        {
            // 1. 部分不能为空
            if (p.empty() || p.size() > 3) return false;
            // 2. 不能有前导零,除非就是 "0"
            if (p[0] == '0' && p.size() > 1) return false;
            // 3. 必须全是数字
            for (char c : p) 
            {
                if (!isdigit(c)) return false;
            }
            // 4. 数字必须在 0-255 范围内
            int num = stoi(p);
            if (num < 0 || num > 255) return false;
        }
        // 防止最后有多余的 '.',例如 "1.1.1.1." 会被分割成4部分,但原字符串最后有'.'
        if (ip.back() == '.') return false;
        return true;
    }

    bool isValidIPv6(const string& ip) 
    {
        vector<string> parts;
        stringstream ss(ip);
        string part;
        // 用 ':' 分割字符串
        while (getline(ss, part, ':')) 
        {
            parts.push_back(part);
        }
        if (parts.size() != 8) return false; // 必须是8部分

        for (const string& p : parts) 
        {
            // 1. 每部分长度必须在 1~4 之间
            if (p.empty() || p.size() > 4) return false;
            // 2. 每字符必须是合法的十六进制数字
            for (char c : p) 
            {
                if (!isxdigit(c)) 
                { // 检查是否是 0-9, a-f, A-F
                    return false;
                }
            }
        }
        // 防止最后有多余的 ':',例如 "2001:0db8:85a3::8A2E:0370:7334:"
        if (ip.back() == ':') return false;
        return true;
    }
};





#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

// 判断是否是有效的 IPv4 地址
int isValidIPv4(char* IP) 
{
    int count = 0; // 段数计数器
    int len = strlen(IP); // 字符串长度
    char* token = strtok(IP, "."); // 按 '.' 分割字符串
    if (len == 0 || IP[len - 1] == ':') return 0; // 字符串为空或以冒号结尾,无效
    while (token) 
    {
        count++; // 段数加 1
        if (count > 4) return 0; // 段数超过 4 无效
        int token_len = strlen(token); // 当前段的长度
        if (token_len == 0 || token_len > 3) return 0; // 段长度为 0 或超过 3,无效

        int num = 0; // 当前段的数值
        for (int i = 0; i < token_len; i++) 
        {
            if (!isdigit(token[i])) return 0; // 字符不是数字,无效
            num = num * 10 + (token[i] - '0'); // 计算数值
        }

        if (num < 0 || num > 255) return 0; // 数值不在 0 - 255 范围内,无效
        if (token_len > 1 && token[0] == '0') return 0; // 有前导零,无效

        token = strtok(NULL, "."); // 获取下一个段
    }

    return count == 4; // 段数恰好为 4,有效
}

// 判断是否是有效的 IPv6 地址
int isValidIPv6(char* IP) 
{
    int len = strlen(IP); // 字符串长度
    if (len == 0 || IP[len - 1] == ':') return 0; // 字符串为空或以冒号结尾,无效

    int count = 0; // 段数计数器
    char* token = strtok(IP, ":"); // 按 ':' 分割字符串

    while (token) 
    {
        count++; // 段数加 1
        if (count > 8) return 0; // 段数超过 8,无效
        int part_len = strlen(token); // 当前段的长度
        if (part_len == 0 || part_len > 4) return 0; // 段长度为 0 或超过 4,无效

        for (int i = 0; i < part_len; i++) 
        {
            if (!isxdigit(token[i])) return 0; // 字符不是 16 进制数字,无效
        }

        token = strtok(NULL, ":"); // 获取下一个段
    }

    return count == 8; // 段数恰好为 8,有效
}

// 主函数,验证 IP 地址类型
char* solve(char* IP) {
    char* ipCopy = strdup(IP); // 复制 IP 字符串
    if (isValidIPv4(ipCopy)) 
    {
        free(ipCopy); // 释放复制的字符串
        return "IPv4"; // 返回 "IPv4"
    }
    free(ipCopy); // 释放复制的字符串

    ipCopy = strdup(IP); // 再次复制 IP 字符串
    if (isValidIPv6(ipCopy)) 
    {
        free(ipCopy); // 释放复制的字符串
        return "IPv6"; // 返回 "IPv6"
    }
    free(ipCopy); // 释放复制的字符串
    return "Neither"; // 返回 "Neither"
}

二、百度网盘 安卓开发


Java部分的一个都不说了!

八股文


算法题




三、百度 C++开发 面经

八股文

算法题


四、百度 实习 Java开发 二面

八股文


算法题


代码如下(示例):

c 复制代码
class Solution
{
public:
    string longestPalindrome(string s)
    {
        // 中⼼扩展算法
        int begin = 0, len = 0, n = s.size();
        for (int i = 0; i < n; i++) // 依次枚举所有的中点
        {
            // 先做⼀次奇数⻓度的扩展
            int left = i, right = i;
            while (left >= 0 && right < n && s[left] == s[right])
            {
                left--;
                right++;
            }
            if (right - left - 1 > len)
            {
                begin = left + 1;
                len = right - left - 1;
            }
            // 偶数⻓度的扩展
            left = i, right = i + 1;
            while (left >= 0 && right < n && s[left] == s[right])
            {
                left--;
                right++;
            }
            if (right - left - 1 > len)
            {
                begin = left + 1;
                len = right - left - 1;
            }
        }
        return s.substr(begin, len);
    }
};

五、百度 Java开发 实习 一面



算法题




这里不要忘了把最后一个区间放进ret数组里面!!!


代码如下(示例):

c 复制代码
class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) 
    {
        // 1. 先按照左端点排序
        sort(intervals.begin(), intervals.end());
        // 2. 合并区间
        int left = intervals[0][0], right = intervals[0][1];
        vector<vector<int>> ret;
        for (int i = 1; i < intervals.size(); i++) 
        {
            int a = intervals[i][0], b = intervals[i][1];
            if (a <= right) // 有重叠部分
            {
                // 合并 - 求并集
                right = max(right, b);
            } 
            else // 没有重叠部分
            {
                ret.push_back({left, right}); // 加⼊到结果中
                left = a;
                right = b;
            }
        }
        // 别忘了最后⼀个区间
        ret.push_back({left, right});
        return ret;
    }
};


六、百度测试开发-实习(二面 10.17)

八股文


算法题


七、百度测试开发-实习(一面 10.15)

八股文


算法题


八、百度边缘计算SRE二面 实习

八股文


算法题


九、

八股文


算法题


十、

八股文


算法题



总结

这篇文章是作者搜集大量面经和资料这里出来的。感谢你的支持
作者wkm是一名中国矿业大学(北京) 大一的新生,希望得到你的关注
如果可以的话,记得一键三联!

相关推荐
辞砚技术录11 小时前
MySQL面试题——联合索引
数据库·面试
小L~~~12 小时前
绿盟校招C++研发工程师一面复盘
c++·面试
UrbanJazzerati13 小时前
解码数据分布:茎叶图和箱形图初学者指南
面试·数据分析
学历真的很重要15 小时前
LangChain V1.0 Context Engineering(上下文工程)详细指南
人工智能·后端·学习·语言模型·面试·职场和发展·langchain
iAkuya15 小时前
(leetcode)力扣100 36二叉树的中序遍历(迭代递归)
算法·leetcode·职场和发展
有一个好名字16 小时前
力扣-小行星碰撞
算法·leetcode·职场和发展
2301_8008951016 小时前
hh的蓝桥杯每日一题--前缀和
职场和发展·蓝桥杯
2301_8008951017 小时前
hh的蓝桥杯每日一题
算法·职场和发展·蓝桥杯
求梦82017 小时前
【力扣hot100题】反转链表(18)
算法·leetcode·职场和发展
NAGNIP18 小时前
机器学习特征工程中的特征选择
算法·面试