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

斩获百度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是一名中国矿业大学(北京) 大一的新生,希望得到你的关注
如果可以的话,记得一键三联!

相关推荐
麦格芬2302 小时前
LeetCode 763 划分字母区间
算法·leetcode·职场和发展
前端一小卒3 小时前
一个看似“送分”的需求为何翻车?——前端状态机实战指南
前端·javascript·面试
面试鸭3 小时前
携程开启秋招补录
职场和发展·互联网
xlp666hub3 小时前
C进阶之内存对齐,硬件总线和高并发伪共享的底层原理
面试·代码规范
xhxxx4 小时前
从被追问到被点赞:我靠“哨兵+快慢指针”展示了面试官真正想看的代码思维
javascript·算法·面试
yaoh.wang4 小时前
力扣(LeetCode) 14: 最长公共前缀 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
Haooog5 小时前
Docker面试题(不定时更新)
java·docker·面试
feathered-feathered5 小时前
Redis基础知识+RDB+AOF(面试)
java·数据库·redis·分布式·后端·中间件·面试
a程序小傲5 小时前
小红书Java面试被问:java创建对象有哪些方式?
java·开发语言·面试