华为OD 技术综合面,手撕代码真题整理(九):最长回文子序列 | 旅行商问题(TSP)

本文整理了华为OD面试的手撕代码真题,包括最长回文子序列和旅行商问题(TSP)。第一题要求找到给定字符串中最长的回文子序列的长度,第二题则是解决经典TSP问题,寻找经过所有城市的最短路径。建议面试者加强算法和编程实践能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

华为 od 手撕代码真题,每篇博客含 2 道真题,来源华为候选人反馈~

华为 OD 面试环节:机考-综测-专业面-hr 面-主管面

两专业面试流程

华为的 OD 面试通常包括两轮专业面试,如下所述:

第一轮专业面试:八股+场景面试

  • 这一轮面试包括了两个主要环节:八股知识和实际场景问题。
  • 面试官会提问涵盖广泛知识领域的问题,要求你展示八股知识。
  • 你需要准备充分,以便在这一环节中表现出自己的专业知识。

第二轮专业面试:编程实践

  • 在第二轮专业面试中,你需要进行编程任务。
  • 这个环节非常重要,要求你展示编程技能和优秀的编码习惯。
  • 请注意命名规范、良好的注释和清晰的思维过程,以帮助面试官理解你的代码。

整个专业面试通常需要约 1 小时,具体时长可能会根据面试官的要求有所不同。在准备期间,建议参考其他面试者的经验分享,以更好地了解面试的内容和期望。
华为OD 技术综合面,手撕代码真题整理(九):最长回文子序列 | 旅行商问题(TSP)

华为 OD 手撕代码

<think>好的,我现在需要帮助用户解决使用ArkTS编写删除回文子序列的问题。首先,我得理解用户的具体需求是什么。题目是“删除回文子序列”,这听起来可能涉及到字符串操作,特别是回文子序列的识别和删除。不过,我需要确认问题的具体要求,因为不同的题目可能有不同的条件。 首先,回文子序列的定义是,一个子序列是原字符串中字符按顺序排列但不一定连续的一个序列,并且这个子序列正读和反读相同。例如,“abcba”中的“abcba”本身就是一个回文子序列。而删除回文子序列的问题可能有不同的变种,比如每次删除一个回文子序列,直到字符串为空,求最少删除次数。例如,LeetCode上有一个问题(1332题)就是这种情况。用户可能指的是这个问题,所以需要先确认这一点。 假设用户的问题确实类似于LeetCode 1332的情况,那么问题可以转化为:给定一个仅由'a'和'b'组成的字符串,每次可以删除一个回文子序列,求删除整个字符串所需的最少次数。根据这个问题的解法,答案其实非常简单,因为如果原字符串本身是回文,那么只需要一次删除;否则,最多需要两次(先删除所有的a,再删除所有的b,或者反之,因为全a或全b的子序列本身就是回文的)。 接下来,我需要考虑如何在ArkTS中实现这个逻辑。ArkTS是华为的ArkUI框架使用的TypeScript扩展,主要用于开发HarmonyOS应用。因此,代码结构应该符合ArkTS的语法规范。 首先,编写一个函数来判断字符串是否为回文。这一步可以通过比较字符串和其反转后的字符串是否相等来实现。对于仅包含'a'和'b'的字符串来说,这应该是直接的。 然后,根据上述判断结果,如果字符串是回文,返回1;否则返回2。因为如果原字符串不是回文,那么我们可以先删除所有的a(构成一个回文子序列),然后剩下的就是全b,再删除一次即可。反之亦然。 接下来需要考虑测试用例的情况,比如空字符串(可能返回0),全a或全b的情况(返回1),以及交替的情况如“ababab”(返回2)。这些测试案例可以验证代码的正确性。 在编写代码时,需要注意ArkTS的语法是否允许使用某些字符串操作方法,比如split、reverse、join等。例如,在TypeScript中,字符串反转可以通过将字符串转为数组,反转后再合并回来。这在ArkTS中应该也是可行的。 所以,具体的步骤可能是: 1. 检查字符串是否为空,若为空则返回0。 2. 检查字符串是否为回文,若是则返回1。 3. 否则返回2。 然后,将上述逻辑用ArkTS代码实现。 现在需要检查是否有特殊情况或者可能的错误。例如,当字符串长度为1时,肯定是回文,返回1。当字符串包含混合字符但已经是回文时,同样返回1。而其他情况则返回2。 最后,将整个思路整理成结构清晰的解答,分步骤说明,并给出代码示例和解释。</think>以下是如何在ArkTS中解决“删除回文子序列”问题的分步说明: --- ### 问题分析 题目要求:给定一个仅由字符 `a` 和 `b` 组成的字符串,每次可以删除一个回文子序列,求删除整个字符串所需的最少次数。 关键点: 1. **回文子序列**:不要求字符连续,只要顺序一致且正反读相同。 2. **最少次数**:通过逻辑推理可知,答案只可能是 `1` 或 `2`: - 如果原字符串是回文,直接删除整个字符串(1次)。 - 否则,先删除全部 `a`,再删除全部 `b`(2次)。 --- ### 实现步骤 1. **判断字符串是否为空**:若为空,直接返回 `0`。 2. **判断是否为回文**:比较字符串与其反转后的结果。 3. **返回结果**:回文则返回 `1`,否则返回 `2`。 --- ### ArkTS 代码实现 ```typescript // 判断字符串是否为回文 function isPalindrome(s: string): boolean { return s === s.split('').reverse().join(''); } // 计算最少删除次数 function removePalindromeSub(s: string): number { if (s.length === 0) { return 0; // 空字符串无需操作 } if (isPalindrome(s)) { return 1; // 直接删除整个回文字符串 } return 2; // 先删全a,再删全b(或反之) } // 测试用例 let testStr1 = "ababa"; console.log(removePalindromeSub(testStr1)); // 输出 1 let testStr2 = "abb"; console.log(removePalindromeSub(testStr2)); // 输出 2 let testStr3 = "a"; console.log(removePalindromeSub(testStr3)); // 输出 1 ``` --- ### 代码解释 1. **`isPalindrome` 函数**: - 将字符串转为数组 → 反转数组 → 合并为字符串。 - 判断原字符串与反转后字符串是否相等。 2. **`removePalindromeSub` 函数**: - 处理边界情况(空字符串)。 - 根据回文判断返回 `1` 或 `2`。 --- ### 复杂度分析 - **时间复杂度**:$O(n)$,其中 $n$ 是字符串长度(反转字符串需要线性时间)。 - **空间复杂度**:$O(n)$,存储反转后的字符串。 --- 通过此方法,可以高效解决删除回文子序列的最小操作次数问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想橡皮擦

如有帮助,来瓶可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值