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

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

相关推荐
风止何安啊1 天前
为什么要有 TypeScript?让 JS 告别 “薛定谔的 Bug”
前端·javascript·面试
Ricky111zzz1 天前
leetcode学python记录1
python·算法·leetcode·职场和发展
逆境不可逃1 天前
LeetCode 热题 100 之 230. 二叉搜索树中第 K 小的元素 199. 二叉树的右视图 114. 二叉树展开为链表
算法·leetcode·职场和发展
wfbcg1 天前
每日算法练习:LeetCode 15. 三数之和 ✅
算法·leetcode·职场和发展
YunQuality1 天前
六西格玛黑带三个月拿证经验分享
笔记·职场和发展·职场·学习方法
人道领域1 天前
【LeetCode刷题日记】242.字母异位词
算法·leetcode·职场和发展
XWalnut1 天前
LeetCode刷题 day8
算法·leetcode·职场和发展
张元清1 天前
不用 Server Components 也能做 React 流式 SSR —— 实战指南
前端·javascript·面试
却话巴山夜雨时i1 天前
互联网大厂Java面试:从Spring到微服务的全栈挑战
java·spring boot·redis·微服务·面试·kafka·技术栈
杰克尼1 天前
springCloud(day10-面试篇)
redis·spring cloud·面试