当前位置: 首页 > news >正文

华为OD机试真题 新系统 2026-06-10 JavaGoC 实现【双系统资源类型调配】【200】

目录

题目

思路

Code


题目

给定两个仅由小写字母组成的字符串四resA和resB。你可以执行恰好一次操作:选择下标i和j,交换resA[i]与resB[j]。问是否存在一种交换,使交换后两个字符串中不同字符的数量相等。
如果存在该交换,则返回交换后resA和resB中不同字符的数量;如果有多种交换方式则采用让两个字符串中不同的字符的数量最少的方式。
如果不存在任何交换方式则返回-1。
提示:
· 1 <= resA.length,resB.length <= 10^5
resA和resB仅由小写英文字母组成

样例1

输入

ac
b

输出

-1
说明

交换任何一组下标都会导致第一个字符串中有2个不同的字符,而在第二个字符串中只有1个不同字符。故无法完成返回-1。
样例2

输入

abcc
aab

输出

2
说明

交换第一个字符串的下标1和第二个字符串的下标0。之后得到word1=“aacc”和word2=“abb”,各有2个不同字符。

思路

枚举所有字符对

因为只有 26 个小写字母,可以枚举所有(a, b)字符对,其中cntA[a] > 0cntB[b] > 0

对每对(a, b)

  • 如果a == b,交换相同字符,字符串不变,deltaA = deltaB = 0
  • 如果a != b
    • A 失去a:若cntA[a] == 1(唯一一个),distinctA 减 1
    • A 获得b:若cntA[b] == 0(A 原来没有 b),distinctA 加 1
    • B 失去b:若cntB[b] == 1,distinctB 减 1
    • B 获得a:若cntB[a] == 0,distinctB 加 1

计算 deltaA 和 deltaB,如果distinctA + deltaA == distinctB + deltaB,就是有效交换。在有效交换中取最小的相等不同字符数。

时间 O(n + 26²),空间 O(26)。

Code

import java.util.Scanner; /** * 交换字符使不同字符数相等 * 输入:两行,分别为 resA 和 resB * 输出:一个整数,表示相等的最小不同字符数,不存在则返回 -1 */ public class Main { public static void main(String[] args) { try (Scanner sc = new Scanner(System.in)) { String resA = sc.nextLine(); String resB = sc.nextLine(); System.out.println(solve(resA, resB)); } catch (Exception e) { System.out.println(-1); } } static int solve(String resA, String resB) { // ---- 统计字符频率 ---- int[] cntA = new int[26]; int[] cntB = new int[26]; for (char c : resA.toCharArray()) cntA[c - 'a']++; for (char c : resB.toCharArray()) cntB[c - 'a']++; // ---- 计算当前不同字符数 ---- int distinctA = 0, distinctB = 0; for (int i = 0; i < 26; i++) { if (cntA[i] > 0) distinctA++; if (cntB[i] > 0) distinctB++; } // ---- 枚举所有可能的字符对 (a, b) ---- int best = Integer.MAX_VALUE; for (int a = 0; a < 26; a++) { if (cntA[a] == 0) continue; // a 在 A 中不存在 for (int b = 0; b < 26; b++) { if (cntB[b] == 0) continue; // b 在 B 中不存在 int deltaA, deltaB; if (a == b) { // 交换相同字符,字符串不变 deltaA = 0; deltaB = 0; } else { // A 失去 a:若 A 中只有这一个 a,不同字符数减 1 // A 获得 b:若 A 原来没有 b,不同字符数加 1 deltaA = (cntA[a] > 1 ? 0 : -1) + (cntA[b] > 0 ? 0 : 1); // B 失去 b:若 B 中只有这一个 b,不同字符数减 1 // B 获得 a:若 B 原来没有 a,不同字符数加 1 deltaB = (cntB[b] > 1 ? 0 : -1) + (cntB[a] > 0 ? 0 : 1); } // 判断交换后是否相等 if (distinctA + deltaA == distinctB + deltaB) { int result = distinctA + deltaA; if (result < best) best = result; } } } return best == Integer.MAX_VALUE ? -1 : best; } }

Go

package main import ( "bufio" "fmt" "math" "os" "strings" ) /** * 交换字符使不同字符数相等 * @param resA 第一个字符串 * @param resB 第二个字符串 * @return 相等的最小不同字符数,不存在返回 -1 */ func solve(resA, resB string) int { // ---- 统计字符频率 ---- cntA := make([]int, 26) cntB := make([]int, 26) for _, ch := range resA { cntA[ch-'a']++ } for _, ch := range resB { cntB[ch-'a']++ } // ---- 计算当前不同字符数 ---- distinctA := 0 distinctB := 0 for i := 0; i < 26; i++ { if cntA[i] > 0 { distinctA++ } if cntB[i] > 0 { distinctB++ } } // ---- 枚举所有可能的字符对 (a, b) ---- best := math.MaxInt32 for a := 0; a < 26; a++ { if cntA[a] == 0 { continue // a 在 A 中不存在 } for b := 0; b < 26; b++ { if cntB[b] == 0 { continue // b 在 B 中不存在 } var deltaA, deltaB int if a == b { // 交换相同字符,字符串不变 deltaA = 0 deltaB = 0 } else { // A 失去 a:若 A 中只有这一个 a,不同字符数减 1 // A 获得 b:若 A 原来没有 b,不同字符数加 1 if cntA[a] > 1 { deltaA = 0 } else { deltaA = -1 } if cntA[b] == 0 { deltaA++ } // B 失去 b:若 B 中只有这一个 b,不同字符数减 1 // B 获得 a:若 B 原来没有 a,不同字符数加 1 if cntB[b] > 1 { deltaB = 0 } else { deltaB = -1 } if cntB[a] == 0 { deltaB++ } } // 判断交换后是否相等 if distinctA+deltaA == distinctB+deltaB { result := distinctA + deltaA if result < best { best = result } } } } if best == math.MaxInt32 { return -1 } return best } func main() { defer func() { if r := recover(); r != nil { fmt.Println(-1) } }() scanner := bufio.NewScanner(os.Stdin) scanner.Scan() resA := strings.TrimSpace(scanner.Text()) scanner.Scan() resB := strings.TrimSpace(scanner.Text()) fmt.Println(solve(resA, resB)) }

C

#include <stdio.h> #include <string.h> #include <limits.h> /** * 交换字符使不同字符数相等 * @param resA 第一个字符串 * @param resB 第二个字符串 * @return 相等的最小不同字符数,不存在返回 -1 */ int solve(const char* resA, const char* resB) { // ---- 统计字符频率 ---- int cntA[26] = {0}, cntB[26] = {0}; for (int i = 0; resA[i]; i++) cntA[resA[i] - 'a']++; for (int i = 0; resB[i]; i++) cntB[resB[i] - 'a']++; // ---- 计算当前不同字符数 ---- int distinctA = 0, distinctB = 0; for (int i = 0; i < 26; i++) { if (cntA[i] > 0) distinctA++; if (cntB[i] > 0) distinctB++; } // ---- 枚举所有可能的字符对 (a, b) ---- int best = INT_MAX; for (int a = 0; a < 26; a++) { if (cntA[a] == 0) continue; // a 在 A 中不存在 for (int b = 0; b < 26; b++) { if (cntB[b] == 0) continue; // b 在 B 中不存在 int deltaA, deltaB; if (a == b) { // 交换相同字符,字符串不变 deltaA = 0; deltaB = 0; } else { // A 失去 a:若 A 中只有这一个 a,不同字符数减 1 // A 获得 b:若 A 原来没有 b,不同字符数加 1 deltaA = (cntA[a] > 1 ? 0 : -1) + (cntA[b] > 0 ? 0 : 1); // B 失去 b:若 B 中只有这一个 b,不同字符数减 1 // B 获得 a:若 B 原来没有 a,不同字符数加 1 deltaB = (cntB[b] > 1 ? 0 : -1) + (cntB[a] > 0 ? 0 : 1); } // 判断交换后是否相等 if (distinctA + deltaA == distinctB + deltaB) { int result = distinctA + deltaA; if (result < best) best = result; } } } return best == INT_MAX ? -1 : best; } int main() { char resA[100005], resB[100005]; if (fgets(resA, sizeof(resA), stdin) == NULL) { printf("-1\n"); return 0; } int lenA = strlen(resA); if (lenA > 0 && resA[lenA - 1] == '\n') resA[lenA - 1] = '\0'; if (lenA > 1 && resA[lenA - 2] == '\r') resA[lenA - 2] = '\0'; if (fgets(resB, sizeof(resB), stdin) == NULL) { printf("-1\n"); return 0; } int lenB = strlen(resB); if (lenB > 0 && resB[lenB - 1] == '\n') resB[lenB - 1] = '\0'; if (lenB > 1 && resB[lenB - 2] == '\r') resB[lenB - 2] = '\0'; printf("%d\n", solve(resA, resB)); return 0; }

【华为od机试真题Python+JS+Java+Go合集】【超值优惠】:Py/JS/Java/Go合集

【华为od机试真题Python】:Python真题题库

【华为od机试真题JavaScript】:JavaScript真题题库

【华为od机试真题Java&Go】:Java&Go真题题库

【华为od机试真题C++】:C++真题题库

【华为od机试真题C语言】:C语言真题题库

【华为od面试手撕代码题库】:面试手撕代码题库

【华为od机试面试交流群】【文章底部有二维码链接,可扫码加交流群】

华为OD机试:二本院校有机会吗?
有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。

http://www.zskr.cn/news/1520568.html

相关文章:

  • R3nzSkin:游戏换肤技术的Windows钩子注入实现深度解析
  • LS1046A SEC中断聚合配置实战:提升嵌入式安全处理器性能
  • 智能科学与技术=人工智能专业? [特殊字符] 高考志愿的十字路口,深度解析与通关秘籍!
  • 保姆级教程:H3C S6520交换机端口状态信息全解读(从display interface到dis brief)
  • MATLAB mesh() 函数保姆级教程:从画一个3D曲面到搞定多图配色与colorbar布局
  • Windows任务栏美化终极指南:3分钟让桌面焕然一新的秘密武器
  • SketchUp STL插件深度解析:专业级3D打印工作流解决方案
  • 重新定义AI员工:超级个体时代来临,个体如何借力Agent实现十倍效率
  • MyBatis 入门到项目实战 IDEA 配置模板 20-22
  • 手把手教你用STM32F103按键控制DDSM210电机转速,并实时调试串口数据
  • 从‘架构浏览器’到‘图形视图’:用Understand可视化你的Spring Boot/微服务项目结构(保姆级图解)
  • CTF新手必看:用Hackbar插件5分钟搞定SWPUCTF那道JSON+POST的PHP题
  • 别再只克隆人声了!so-vits-svc 4.0进阶玩法:用UVR5分离伴奏,打造你的专属AI翻唱完整曲目
  • 2026年当前,视展信息如何定义可视化示教品牌的诚信与实力? - 品牌鉴赏官2026
  • 2026年四川高炮广告产业格局与区域服务商能力解析:从成都到西藏、新疆的跨区域工程实践 - 优质品牌商家
  • 2026年四川假发市场深度观察:从定制工艺到服务体系的全面解析 - 优质品牌商家
  • 从论文被拒到秒过:手把手教你用MATLAB搞定SCI期刊要求的图表格式(含字体、线型、符号全设置)
  • 双路FOC驱动解决方案:如何用低成本ESP32实现专业级无刷电机控制
  • 认知几何学与Gärdenfors概念空间理论:相同点与本质差异的对比分析报告(世毫九实验室原创研究)
  • 告别静态截图!用Matlab Appdesigner + animatedline函数,让Simulink仿真结果“动”起来
  • 08-Python异常处理-你写的try-except可能比不写更危险
  • 2026优质凤凰办理公司注销业务公司排行哪家好 - 品牌排行榜
  • 3分钟上手MMD Tools:Blender中导入导出MMD模型的完整指南
  • 告别Xftp!AutoDL+JupyterLab一站式搞定YOLOv5文件上传与训练(附数据集管理技巧)
  • 2026年近期诚信的天津物流货代业内推荐:聚焦天津港的可靠伙伴 - 品牌鉴赏官2026
  • 2026 最新 CTF 备赛全流程|零基础分阶段进阶路线 + 刷题完整思路 + 赛场夺分技巧一站式汇总
  • 鸿蒙游戏Runtime解析:Store如何驱动整个游戏世界?
  • BilibiliDown完整指南:如何快速批量下载B站视频
  • [机器学习]Kaggle:CV、Public LB and Private LB
  • 知乎数据获取的终极方案:zhihu-api让你轻松玩转知乎开放数据