当前位置: 首页 > 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.jsqmd.com/news/1008765/

相关文章:

  • MATLAB数据处理效率翻倍:巧用reshape函数将表格数据快速转为图像输入格式
  • R3nzSkin:游戏换肤技术的Windows钩子注入实现深度解析
  • Python多重循环实战:从鸡兔同笼到打印字母金字塔,新手必练的5个经典案例
  • GPT4ALL的LocalDocs功能实战:如何用你的本地文档(PDF/TXT)搭建一个私密知识库问答系统
  • CH32V103/V307 IAP跳转避坑指南:机器模式配置、函数属性与长跳转的那些事儿
  • 联想拯救者工具箱终极指南:3步轻松掌控游戏本性能
  • 手把手教你用RISC-V Sail Model生成C模拟器:从形式化规范到可执行代码
  • 智能科学与技术=人工智能专业? [特殊字符] 高考志愿的十字路口,深度解析与通关秘籍!
  • AI 时代,真正的差距不是模型能力,而是控制能力
  • 还在手写会议纪要?这5个AI工具一键搞定全部内容
  • 异常值检测实战:可视化诊断与统计方法双轨并行
  • Spring Boot项目从fastjson1.x升级到fastjson2.x实战:手把手教你重写Redis序列化工具类
  • LS1046A SEC中断聚合配置实战:提升嵌入式安全处理器性能
  • 保姆级教程:H3C S6520交换机端口状态信息全解读(从display interface到dis brief)
  • 别再死记硬背for循环了!用Python解决‘完全数’和‘剩余木料’问题,理解循环嵌套的本质
  • 厉害了,程序员的高考试卷,你能拿几分?
  • 基于PLC的智能温室控制系统设计12(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)
  • 收藏!2026 年版 AI 行业深度解析:不用焦虑,普通人零基础也能入局大模型赛道
  • 区块链解决信任分布,AI 需要解决能力控制
  • 抖音无水印下载终极指南:douyin-downloader免费批量下载工具
  • Windows任务栏美化终极指南:3分钟让桌面焕然一新的秘密武器
  • MATLAB mesh() 函数保姆级教程:从画一个3D曲面到搞定多图配色与colorbar布局
  • 重新定义AI员工:超级个体时代来临,个体如何借力Agent实现十倍效率
  • SketchUp STL插件深度解析:专业级3D打印工作流解决方案
  • OmenSuperHub终极指南:解锁惠普游戏本硬件控制的完整解决方案
  • SDRAM控制器低功耗模式:自刷新、掉电与时钟挂起配置详解
  • MyBatis 入门到项目实战 IDEA 配置模板 20-22
  • 配电柜带电清洗注意事项
  • 从‘架构浏览器’到‘图形视图’:用Understand可视化你的Spring Boot/微服务项目结构(保姆级图解)
  • CTF新手必看:用Hackbar插件5分钟搞定SWPUCTF那道JSON+POST的PHP题