《leetcode》华为技术面试题库

No.820 单词的压缩编码

题目描述:给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。例如,如果这个列表是 ["time", "me", "bell"],我们就可以将其表示为 S = "time#bell#" 和 indexes = [0, 2, 5]。对于每一个索引,我们可以通过从字符串 S 中索引的位置开始读取字符串,直到 "#" 结束,来恢复我们之前的单词列表。那么成功对给定单词列表进行编码的最小字符串长度是多少呢?

解题思路:目标是保留所有不是其他单词后缀的单词,因此考虑使用字典树的方法。找到是否不同的单词具有相同的后缀,我们可以将其反序之后插入字典树中。例如,我们有 "time" 和 "me",可以将 "emit" 和 "em" 插入字典树中。

# 定义字典树中的一个节点
class Node(object):
    def __init__(self):
        self.children={}
class Solution:
    def minimumLengthEncoding(self, words: List[str]) -> int:
        words = list(set(words)) #需要去重,否则在之后计算“叶子高度”的时候会重复计算
        trie=Node() #这是字典树的根
        nodes=[] #这里保存着每个word对应的最后一个节点,比如对于单词time,它保存字母t对应的节点(因为是从后往前找的)
        for word in words:  #逐个单词遍历
            now=trie  #定义临时变量保存当前节点
            for w in reversed(word):  #字符串反转
                if w in now.children:  #如果在,就继续往下遍历
                    now=now.children[w]
                else:
                    now.children[w]=Node()
                    now=now.children[w]
            nodes.append(now)
        ans=0
        for w,c in zip(words,nodes):
            if len(c.children)==0: #没有children,意味着这个节点是个叶子,nodes保存着每个word对应的最后一个节点,当它是一个叶子时,我们就该累加这个word的长度+1,这就是为什么我们在最开始要去重
                ans+=len(w)+1
        return ans

No.1109 航班预订

题目描述:这里有 n 个航班,它们分别从 1 到 n 进行编号。我们这儿有一份航班预订表,表中第 i 条预订记录 bookings[i] = [i, j, k] 意味着我们在从 i 到 j 的每个航班上预订了 k 个座位。请你返回一个长度为 n 的数组 answer,按航班编号顺序返回每个航班上预订的座位数。

解题思路:这个题如果采用暴力法,尝试后发现超时,因此考虑使用差分数列的思想。每一次区间性累加,差分数列变的值都是两端的,因此每次计算只要算两个值即可。时间复杂度大大减小。

class Solution:
    def corpFlightBookings(self, bookings: List[List[int]], n: int) -> List[int]:
        res=(n+1)*[0]
        for i,j,k in bookings:
            res[i-1]+=k
            res[j]-=k
        for i in range(1,n):
            res[i]+=res[i-1]
        return res[:-1]

No.5 最长回文子串

题目描述:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

解题思路:首先这是要求一个回文串,并且求的是子串。这种情况下,首先考虑使用中心扩散法,从中间位置向两边扩散。

class Solution {
public:
    string longestPalindrome(string s) {
        if(s.size()<2) return s;
        int maxlen=0,start=0;
        for(int i=0;i<s.size()-1;++i)
        {
            find(s,i,i,start,maxlen);
            find(s,i,i+1,start,maxlen);
        }
        return s.substr(start,maxlen);
    }
    void find(string s,int left,int right,int& start,int& maxlen)
    {
        while(left>=0&&right<s.size()&&s[left]==s[right]) //向两边扩散
        {
            --left;
            ++right;
        }
        if(maxlen<right-left-1)
        {
            start=left+1;
            maxlen=right-left-1;
        }
    }
};

No.2 两数相加

题目描述:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

解题思路:并行求两个链表的逐位和

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *newlist=new ListNode(-1),*cur=newlist;
        int current=0;//进位值
        while(l1||l2)
        {
            int val1=l1?l1->val:0;
            int val2=l2?l2->val:0;
            int sum=val1+val2+current;
            current=sum/10;
            cur->next=new ListNode(sum%10);
            cur=cur->next;
            if(l1!=nullptr) l1=l1->next;
            if(l2!=nullptr) l2=l2->next;
        }
        if(current) cur->next=new ListNode(1);
        return newlist->next;
    }
};

 

<think>嗯,用户想了解华为OD的技术面试。首先,我需要确认华为OD是什么。华为OD通常指的是华为的“Outstanding Developer”计划,也就是他们的人才招聘项目,主要面向软件开发、算法、测试等岗位的候选人。 接下来,用户需要的是技术面试的相关信息。作为面试准备,了解常见的型和考察重点很重要。不过,华为的具体面试可能受保密协议限制,不能公开详细目。但可以整理一些常见的考点和型,帮助用户进行准备。 首先,技术面试通常分为几个环节:在线测评、技术笔试、技术面试(可能有几轮)、综合面试等。每个环节考察的内容不同。用户可能更关注技术面试部分,尤其是编程和系统设计。 在技术面试中,常见的型包括算法与数据结构、操作系统、网络、数据库、设计模式、项目经验等。对于华为OD来说,可能更侧重算法和编程能力,因为OD项目注重开发能力。 算法方面,LeetCode中等难度的目比较常见,比如动态规划、树、图、字符串处理等。例如,最长回文子串、二叉树的中序遍历、两数之和等目。此外,可能涉及一些优化问,比如时间复杂度或空间复杂度的优化。 系统设计可能考察如何设计一个分布式系统、缓存机制、数据库分库分表等。这部分需要候选人具备一定的实际项目经验和系统架构能力。 此外,项目经验也是面试中的重要部分。面试官会询问候选人过去做过的项目,技术难点,解决方案,以及个人在项目中的贡献。需要准备好具体的案例,用STAR法则(情境、任务、行动、结果)来回答。 还有可能涉及计算机网络和操作系统的基础知识,比如TCP/IP协议栈、进程与线程的区别、内存管理、死锁等。数据库方面的事务隔离级别、索引原理等也是常考点。 另外,华为的企业文化也是面试中可能被考察的部分,比如对华为的了解、为什么选择华为等。虽然不属于技术问,但提前准备会有帮助。 需要注意的是,华为OD的技术面试可能更注重实际编码能力和问解决能力,因此在准备时要多练习手写代码,尤其是在白板或纸上写出无语法错误的代码。同时,注意代码的边界条件处理和异常情况处理。 总结下来,用户可能需要的是面试准备的方向和建议,而不是具体的目。因此,回答时应重点介绍常见的考察领域、型结构,以及备考策略,帮助用户系统地准备华为OD的技术面试。</think>华为OD(Outstanding Developer)技术面试通常分为多个环节,重点考察算法能力、编程基础、系统设计及项目经验。以下为面试准备的核心要点及常见型解析: --- ### **一、面试流程概述** 1. **在线测评**:逻辑推理、性格测试、基础编码。 2. **技术笔试**:3-4道编程(中等难度,限时2小时)。 3. **技术面试(2-3轮)**:手撕代码 + 技术深度问答。 4. **综合面试**:项目经验、职业规划、软技能评估。 --- ### **二、技术面试高频考点** #### **1. 算法与数据结构** - **必考型**: - **动态规划**:背包问、最长子序列(例如:最长递增子序列)。 - **树与图**:二叉树遍历(非递归实现)、最近公共祖先(LCA)、拓扑排序。 - **字符串处理**:KMP算法、回文子串、字符串匹配。 - **数组与链表**:合并区间、链表反转、环检测。 - **例**: ```text 输入一个整数数组,调整数组中数字的顺序,使所有奇数位于偶数前面,且保持奇数和偶数的相对顺序不变。 ``` **关键点**:双指针法或稳定排序思想。 #### **2. 操作系统** - **高频问**: - 进程与线程的区别,协程的适用场景。 - 死锁的四个必要条件及避免策略。 - 虚拟内存与页面置换算法(如LRU实现)。 #### **3. 计算机网络** - **核心问**: - TCP三次握手/四次挥手,TIME_WAIT状态的作用。 - HTTP与HTTPS的区别,SSL/TLS握手流程。 - 浏览器输入URL后发生了什么? #### **4. 数据库** - **重点考察**: - 事务的ACID特性,隔离级别及脏读/幻读问。 - B+树索引原理,联合索引的最左匹配原则。 - SQL优化:EXPLAIN命令解析执行计划。 --- ### **三、手撕代码环节技巧** 1. **代码规范**: - 变量命名清晰,避免全局变量。 - 边界条件处理(如空输入、负数、溢出)。 2. **复杂度分析**: - 主动说明时间/空间复杂度,提出优化思路。 - 示例:两数之和问,从$$O(n^2)$$暴力法优化到$$O(n)$$哈希表。 --- ### **四、系统设计示例** **目**:设计一个分布式ID生成器(要求高可用、全局唯一、趋势递增)。 **回答框架**: 1. **需求分析**:唯一性、性能、容灾。 2. **方案选型**: - 雪花算法(Snowflake):$$ \text{ID} = \text{时间戳} + \text{机器ID} + \text{序列号} $$。 - Redis原子操作INCR。 3. **容错设计**:机器ID动态分配、时钟回拨处理。 --- ### **五、项目经验提问** - **STAR法则**: - **Situation**:项目背景与目标。 - **Task**:你的具体职责。 - **Action**:技术选型与难点突破。 - **Result**:量化成果(如性能提升30%)。 --- ### **六、备考建议** 1. **平台**:LeetCode(精选华为库)、牛客网。 2. **模拟面试**:使用白板练习手写代码,录音复盘表达逻辑。 3. **技术深度**:深入理解1-2个技术栈(如Redis源码、JVM原理)。 --- 通过系统性准备算法、底层原理及项目表述,可显著提升通过率。建议每天至少完成3道中等难度算法,并针对薄弱领域专项突破。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值