华为OD机考双机位C卷 - 出错的或电路 (Java Python JS C/C++ GO )

最新华为OD机试

真题目录:点击查看目录
华为OD面试真题精选:点击立即查看

华为OD机考双机位C卷 - 出错的或电路

题目描述

某生产门电路的厂商发现某一批次的或门电路不稳定,具体现象为计算两个二进制数的或操作时,第一个二进制数中某两个比特位会出现交换,交换的比特位置是随机的,但只交换这两个位,其他位不变。

很明显,这个交换可能会影响最终的或结果,也可能不会有影响。

为了评估影响和定位出错的根因,工程师需要研究在各种交换的可能下,最终的或结果发生改变的情况有多少种。

输入描述

第一行有一个正整数N; 其中1≤N≤1000000。
第二行有一个长为N的二进制数,表示与电路的第一个输入数,即会发生比特交换的输入数。
第三行有一个长为N的二进制数,表示与电路的第二个输入数。注意第二个输入数不会发生比特交换。

输出描述

输出只有一个整数,表示会影响或结果的交换方案个数。

示例1

输入

3 010 110

输出

1

说明

原本010和110的或结果是110,但第一个输入数可能会发生如下三种交换:

1、交换第1个比特和第2个比特,第一个输入数变为100,计算结果为110,计算结果不变
2、交换第1个比特和第3个比特,第一个输入数变为010,计算结果为110,计算结果不变
3、交换第2个比特和第3个比特,第一个输入数变为001,计算结果为111,计算结果改变
故只有一种交换会改变计算结果。

示例2

输入

6 011011 110110

输出

4

说明

原本011011和110110的或结果是111111,但是第一个输入数发生如下比特交换会影响最终计算结果:

1、交换第1个比特和第3个比特,第一个输入数变为110011,计算结果变为110111

2、交换第1个比特和第6个比特,第一个输入数变为111010,计算结果变为111110

3、交换第3个比特和第4个比特,第一个输入数变为010111,计算结果变为110111

4、交换第4个比特和第6个比特,第一个输入数变为011110,计算结果变为111100

其他交换都不会影响计算结果,故输出4.

解题思路

题目中的“或”运算

在二进制中,“或”运算的规则是:如果两个对应位置的位中有一个为1,结果就是1;如果两个都为0,结果才是0。

示例解释

示例1
  • 输入:
    N = 3 第一个输入数 = 010 第二个输入数 = 110
  • 不做交换时,“或”结果是110
  • 考虑所有可能的交换:
    1. 交换第1和第2位,得到第一个输入数100,结果仍然是110
    2. 交换第1和第3位,得到第一个输入数010,结果仍然是110
    3. 交换第2和第3位,得到第一个输入数001,结果变为111,与原始结果不同。
  • 只有第三种交换会改变结果,因此输出1
示例2
  • 输入:
    N = 6 第一个输入数 = 011011 第二个输入数 = 110110
  • 原始“或”运算结果是111111
  • 列出所有可能导致不同结果的交换方案,共4种,因此输出4

关键点

  • 枚举第一个输入数的所有比特位对(组合),假设它们进行了交换,检查是否导致“或”运算结果变化。
  • 如果变化,则计入总数。

思路

在给定两个二进制字符串时,我们需要统计四种不同位的组合来简化逻辑判断。可以使用以下步骤来实现:

  1. 遍历两个字符串,并分别统计以下位数:

    • count_01:第一个字符串在该位为0且第二个字符串在该位为1的数量。
    • count_10:第一个字符串在该位为1且第二个字符串在该位为0的数量。
    • count_00:第一个字符串在该位为0且第二个字符串在该位为0的数量。
    • count_11:第一个字符串在该位为1且第二个字符串在该位为1的数量。
  2. 根据统计的结果,我们可以得出交换导致结果变化的方案数量公式:

    • count_01 * count_10:第一个字符串为0且第二个字符串为1的位,与第一个字符串为1且第二个字符串为0的位交换会导致结果变化。
    • count_00 * (count_10 + count_11):第一个字符串为0且第二个字符串为0的位,与其他任何为1的位交换会导致结果变化。
  3. 最终表达式为:
    total_result = count_01 × count_10 + count_00 × ( count_10 + count_11 ) \text{total\_result} = \text{count\_01} \times \text{count\_10} + \text{count\_00} \times (\text{count\_10} + \text{count\_11})total_result=count_01×count_10+count_00×(count_10+count_11)

这样设计逻辑不仅简化了复杂判断,还避免了重复计数。公式本身清晰直观,不需要进一步去重或复杂处理。

示例

6 011011 110110

其中:

  • n = 6,表示二进制数的位数。
  • bin1 = "011011"是第一个二进制字符串。
  • bin2 = "110110"是第二个二进制字符串。

逐步解析

  1. 变量初始化

    • count_01:统计bin10bin21的位数。
    • count_10:统计bin11bin20的位数。
    • count_00:统计bin10bin20的位数。
    • count_11:统计bin11bin21的位数。
  2. 统计每种情况的位数

    • 逐位遍历bin1bin2
    • 根据当前位的组合情况 (00,01,10,11),对应增加相应的计数器。
    遍历结果(逐位分析):
    • 第 1 位:bin10bin21,因此count_01++,得到count_01 = 1
    • 第 2 位:bin11bin21,因此count_11++,得到count_11 = 1
    • 第 3 位:bin11bin20,因此count_10++,得到count_10 = 1
    • 第 4 位:bin10bin21,因此count_01++,得到count_01 = 2
    • 第 5 位:bin11bin21,因此count_11++,得到count_11 = 2
    • 第 6 位:bin11bin20,因此count_10++,得到count_10 = 2

    最终统计结果:

    • count_01 = 2
    • count_10 = 2
    • count_00 = 0
    • count_11 = 2
  3. 计算最终结果

    • 根据公式:
      result = count_01 × count_10 + count_00 × ( count_10 + count_11 ) \text{result} = \text{count\_01} \times \text{count\_10} + \text{count\_00} \times (\text{count\_10} + \text{count\_11})result=count_01×count_10+count_00×(count_10+count_11)

    • 代入统计结果:
      result = 2 × 2 + 0 × ( 2 + 2 ) = 4 + 0 = 4 \text{result} = 2 \times 2 + 0 \times (2 + 2) = 4 + 0 = 4result=2×2+0×(2+2)=4+0=4

  4. 输出结果

    • System.out.println(result);输出4

总结

该代码的运行结果为4,代表在满足题意的交换条件下可以导致结果变化的交换方案数为 4。

Java

importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);intn=scanner.nextInt();// 输入的二进制数的位数Stringbin1=scanner.next();// 第一个二进制数Stringbin2=scanner.next();// 第二个二进制数// 定义四种统计计数器intcount_01=0;// bin1 为 0 且 bin2 为 1 的位数量intcount_10=0;// bin1 为 1 且 bin2 为 0 的位数量intcount_00=0;// bin1 为 0 且 bin2 为 0 的位数量intcount_11=0;// bin1 为 1 且 bin2 为 1 的位数量// 遍历每一位,根据 bin1 和 bin2 的情况进行分类统计for(inti=0;i<n;i++){charb1=bin1.charAt(i);charb2=bin2.charAt(i);if(b1=='0'&&b2=='1'){count_01++;}elseif(b1=='1'&&b2=='0'){count_10++;}elseif(b1=='0'&&b2=='0'){count_00++;}elseif(b1=='1'&&b2=='1'){count_11++;}}// 根据公式计算最终结果intresult=count_01*count_10+count_00*(count_10+count_11);System.out.println(result);}}

Python

n=int(input())# 输入的二进制数的位数bin1=input()# 第一个二进制数bin2=input()# 第二个二进制数# 定义四种统计计数器count_01=0# bin1 为 0 且 bin2 为 1 的位数量count_10=0# bin1 为 1 且 bin2 为 0 的位数量count_00=0# bin1 为 0 且 bin2 为 0 的位数量count_11=0# bin1 为 1 且 bin2 为 1 的位数量# 遍历每一位,根据 bin1 和 bin2 的情况进行分类统计foriinrange(n):b1=bin1[i]b2=bin2[i]ifb1=='0'andb2=='1':count_01+=1elifb1=='1'andb2=='0':count_10+=1elifb1=='0'andb2=='0':count_00+=1elifb1=='1'andb2=='1':count_11+=1# 根据公式计算最终结果result=count_01*count_10+count_00*(count_10+count_11)print(result)# 输出结果

JavaScript

constreadline=require('readline');// 创建接口用于用户输入constrl=readline.createInterface({input:process.stdin,output:process.stdout});rl.on("line",function(n){rl.on("line",function(bin1){rl.on("line",function(bin2){n=parseInt(n);// 转换输入的位数为整数// 定义四种统计计数器letcount_01=0;// bin1 为 0 且 bin2 为 1 的位数量letcount_10=0;// bin1 为 1 且 bin2 为 0 的位数量letcount_00=0;// bin1 为 0 且 bin2 为 0 的位数量letcount_11=0;// bin1 为 1 且 bin2 为 1 的位数量// 遍历每一位,根据 bin1 和 bin2 的情况进行分类统计for(leti=0;i<n;i++){constb1=bin1[i];constb2=bin2[i];if(b1==='0'&&b2==='1'){count_01++;}elseif(b1==='1'&&b2==='0'){count_10++;}elseif(b1==='0'&&b2==='0'){count_00++;}elseif(b1==='1'&&b2==='1'){count_11++;}}// 根据公式计算最终结果constresult=count_01*count_10+count_00*(count_10+count_11);console.log(result);// 输出结果rl.close();});});});

C++

#include<iostream>#include<string>using namespace std;intmain(){intn;cin>>n;// 输入的二进制数的位数string bin1,bin2;cin>>bin1;// 第一个二进制数cin>>bin2;// 第二个二进制数// 定义四种统计计数器intcount_01=0;// bin1 为 0 且 bin2 为 1 的位数量intcount_10=0;// bin1 为 1 且 bin2 为 0 的位数量intcount_00=0;// bin1 为 0 且 bin2 为 0 的位数量intcount_11=0;// bin1 为 1 且 bin2 为 1 的位数量// 遍历每一位,根据 bin1 和 bin2 的情况进行分类统计for(inti=0;i<n;i++){charb1=bin1[i];charb2=bin2[i];if(b1=='0'&&b2=='1'){count_01++;}elseif(b1=='1'&&b2=='0'){count_10++;}elseif(b1=='0'&&b2=='0'){count_00++;}elseif(b1=='1'&&b2=='1'){count_11++;}}// 根据公式计算最终结果intresult=count_01*count_10+count_00*(count_10+count_11);cout<<result<<endl;// 输出结果return0;}

Go

packagemainimport("fmt")funcmain(){varnintvarbin1,bin2string// 读取输入// fmt.Scan 会自动跳过空白符读取数据,功能类似于 Java 的 scanner.next()if_,err:=fmt.Scan(&n,&bin1,&bin2);err!=nil{return}// 定义四种统计计数器count_01:=0count_10:=0count_00:=0count_11:=0// 遍历每一位,根据 bin1 和 bin2 的情况进行分类统计fori:=0;i<n;i++{// Go 语言中通过索引访问字符串得到的是 byte (ASCII字符)b1:=bin1[i]b2:=bin2[i]ifb1=='0'&&b2=='1'{count_01++}elseifb1=='1'&&b2=='0'{count_10++}elseifb1=='0'&&b2=='0'{count_00++}elseifb1=='1'&&b2=='1'{count_11++}}// 根据公式计算最终结果result:=count_01*count_10+count_00*(count_10+count_11)fmt.Println(result)}

C语言

#include<stdio.h>#include<string.h>intmain(){intn;scanf("%d",&n);// 输入的二进制数的位数charbin1[100],bin2[100];scanf("%s",bin1);// 第一个二进制数scanf("%s",bin2);// 第二个二进制数// 定义四种统计计数器intcount_01=0;// bin1 为 0 且 bin2 为 1 的位数量intcount_10=0;// bin1 为 1 且 bin2 为 0 的位数量intcount_00=0;// bin1 为 0 且 bin2 为 0 的位数量intcount_11=0;// bin1 为 1 且 bin2 为 1 的位数量// 遍历每一位,根据 bin1 和 bin2 的情况进行分类统计for(inti=0;i<n;i++){charb1=bin1[i];charb2=bin2[i];if(b1=='0'&&b2=='1'){count_01++;}elseif(b1=='1'&&b2=='0'){count_10++;}elseif(b1=='0'&&b2=='0'){count_00++;}elseif(b1=='1'&&b2=='1'){count_11++;}}// 根据公式计算最终结果intresult=count_01*count_10+count_00*(count_10+count_11);printf("%d\n",result);// 输出结果return0;}

完整用例

用例1

3 010 110

用例2

4 1010 1111

用例3

5 01101 10010

用例4

6 110011 101010

用例5

7 1010101 1111111

用例6

10 1101100101 1011010101

用例7

8 11111111 00000000

用例8

12 110011001100 101010101010

用例9

16 1010101010101010 0101010101010101

用例10

20 10101010101010101010 01010101010101010101

文章目录

  • 最新华为OD机试
  • 题目描述
  • 输入描述
  • 输出描述
  • 示例1
  • 示例2
  • 解题思路
      • 题目中的“或”运算
      • 示例解释
        • 示例1
        • 示例2
      • 关键点
    • 思路
      • 示例
      • 逐步解析
        • 遍历结果(逐位分析):
      • 总结
  • Java
  • Python
  • JavaScript
  • C++
  • Go
  • C语言
  • 完整用例
    • 用例1
    • 用例2
    • 用例3
    • 用例4
    • 用例5
    • 用例6
    • 用例7
    • 用例8
    • 用例9
    • 用例10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1119881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信王炸!AI 应用与线上工具小程序成长计划,普通开发者的黄金机会来了!

微信王炸&#xff01;AI 应用与线上工具小程序成长计划&#xff0c;普通开发者的黄金机会来了&#xff01; 码上全栈创享家 原创整理 聚焦项目实战&#xff5c;前端 后端 小程序 AI 应用 随着 AI 应用从“尝鲜”走向“刚需”&#xff0c;一个现实问题摆在开发者面前&#x…

信创产品委托第三方检测机构进行国产化测试多少钱

随着信创产业深入推进&#xff0c;越来越多的科研企业将信创产品送至第三方检测机构进行国产化适配认证。那么了解国产化测试的收费内容&#xff0c;更有助于软件公司们合理规划测试预算。一、基础检测费用基础费用根据产品类型与测试范围确定。软件产品通常依据功能模块数量、…

2026 年,手把手教你用 HubSpot 创建社交媒体营销日历

新年第一步&#xff1a;告别临时抱佛脚&#xff0c;让内容规划走上正轨 元旦假期一过&#xff0c;2026 年就正式开始了。对于营销人来说&#xff0c;新的一年意味着新的 KPI&#xff0c;也意味着一个老问题又摆在面前&#xff1a;明天发什么&#xff1f;下周发什么&#xff1f;…

破局增长!AI+本地化双轮驱动客户管理,软件公司CRM应用实战指南

——从客户管理到智能决策&#xff0c;打造高效增长引擎 一、软件公司为何必须拥抱CRM&#xff1f; 在需求迭代加速、客户价值深化的今天&#xff0c;传统Excel微信的管理模式正成为软件企业发展的桎梏&#xff1a; 客户资产流失风险&#xff1a;项目信息散落于个人电脑/群聊&a…

详解银狐远控源码中那些C++编码问题

特别申明&#xff1a; 本文内容仅限于用作技术交流&#xff0c;请勿使用本文介绍的技术做任何其他用途&#xff0c;否则后果自负&#xff0c;与本号无关。 原始的银狐远程控制软件中&#xff0c;存在大量C编码问题&#xff0c;大多数错误都属于低级错误。这些错误造成银狐远控…

泥石流与滑坡识别图像数据集 自然灾害实时监测 地质灾害监测场景下目标检测 自然灾害早期识别代码 自然灾害风险预警 AI应急响应辅助识别(代码+模型+数据集)10356期

数据集 README核心信息汇总表项目详情类别数量及名称2 类&#xff1a;泥石流、滑坡数据数量2140 条格式种类YOLO 格式应用价值适配地质灾害监测场景下目标检测模型训练&#xff0c;可用于灾害早期识别、风险预警、应急响应辅助决策等场景 数据类别概述 数据集聚焦地质灾害核心 …

从 SEO 到 AEO:Semrush Enterprise AIO 平台如何助力出海品牌抢占 AI 流量入口?

作为企业级的 AI 优化平台&#xff0c;Semrush Enterprise AIO 专门用于追踪和提升品牌在 AI 模型上的可见性。 如今&#xff0c;全球用户都在深度使用 AI&#xff0c;把 AI 当作首选的信息来源入口。从产品调研到购买决策&#xff0c;他们不再逐页翻阅搜索引擎提供的结果&…

铅冶炼含铊污酸处理技术:Tulsimer树脂助力污泥减量与稳定达标

在环保监管日趋严格的背景下&#xff0c;铅冶炼行业含铊污酸处理已成为制约企业合规运营的核心难题。此类烟气净化废水占冶炼总废水量的20%-30%&#xff0c;受原料含铊特性及稀酸循环使用影响&#xff0c;水体中总铊浓度呈持续攀升态势&#xff0c;给处理工艺带来极大挑战。铊作…

notebook的图显示中文的设置

apt updateapt install -y fonts-wqy-microheifc-list | grep -E “WenQuanYi|Noto”清楚缓存 import matplotlib import os import shutil# 获取matplotlib缓存目录 cache_dir matplotlib.get_cachedir() print(f"Matplotlib缓存目录&#xff1a;{cache_dir}")# …

Java中synchronized和ReentrantLock锁重入机制详解

在Java中&#xff0c;锁的重入&#xff08;Reentrancy&#xff09; 是指同一个线程可以多次获取同一把锁而不会造成死锁的特性。这是Java内置锁&#xff08;synchronized&#xff09;和ReentrantLock的一个重要特性。 核心概念 当一个线程已经持有某个锁时&#xff0c;它可以再…

Java中的锁对象详解

锁是什么&#xff1f; 1. 对于实例方法&#xff08;非static&#xff09; public class Demo {// 实例方法上的synchronizedpublic synchronized void methodA() {methodB(); // 调用另一个synchronized方法}public synchronized void methodB() {// ...} }锁对象 当前实例对…

深度学习毕设选题推荐:基于python深度学习的树叶健康识别人工智能

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Java 对接 PLC 实战:西门子 PLC 与永宏 PLC 通讯方式全面对比

下面这篇按“从 0 到能跑通”的思路&#xff0c;把 西门子&#xff08;Siemens&#xff09;PLC 和 永宏&#xff08;FATEK/永宏电机&#xff09;PLC 在 用 Java 对接硬件 时的差异讲清楚&#xff1a;差异到底来自哪里、配置要点是什么、代码通常怎么写、踩坑点有哪些。读完你应…

入校申报审批系统的设计与实现毕业论文+PPT(附源代码+演示视频)

文章目录入校申报审批系统的设计与实现一、项目简介&#xff08;源代码在文末&#xff09;1.运行视频2.&#x1f680; 项目技术栈3.✅ 环境要求说明4.包含的文件列表&#xff08;含论文&#xff09;数据库结构与测试用例系统功能结构后端运行截图项目部署源码下载入校申报审批系…

化工TPM预防性维护落地指南:从0到1实现故障降40%

作为化工企业的工程技术人员&#xff0c;你是否经常面临这样的困境&#xff1a;设备故障突发难以预判&#xff0c;熬夜抢修成为常态&#xff1b;维护计划缺乏针对性&#xff0c;过度维护浪费资源、维护不足引发故障。其实&#xff0c;通过科学搭建TPM预防性维护体系&#xff0c…

一篇讲透:芋道源码中的「租户」是如何通过程序控制的?

一、先别急着看代码&#xff1a;什么是「租户」&#xff1f; 1️⃣ 什么是租户&#xff08;Tenant&#xff09;&#xff1f; 在 SaaS 系统 中&#xff1a;租户 一套系统的一个“客户单位”举几个直观例子&#xff1a;一个 OA 系统 A 公司是一位租户B 公司是另一位租户一个进销…

凤希AI伴侣开发手记:那些只有深度使用才暴露的“缺点”

大家好&#xff0c;我是凤希。现在是2026年1月6号晚上七点多&#xff0c;我才开始整理昨天的工作。这几天&#xff0c;我的作息完全颠倒了&#xff0c;经常早上七八点才睡&#xff0c;下午四点才起&#xff0c;活脱脱一个“美国时间”。为啥&#xff1f;因为这几天我几乎把所有…

计算机深度学习毕设实战-基于python深度学习的树叶健康识别机器学习

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

芋道(Ruoyi-Vue-Pro)对接腾讯云短信:没配回调URL,为啥也能看到发送成功/失败?如何排查?

很多人第一次把芋道&#xff08;Ruoyi-Vue-Pro / 芋道源码&#xff09;接到腾讯云短信时&#xff0c;都会遇到一个“看起来矛盾”的现象&#xff1a;我在芋道里没有配置短信回调 URL但在【短信日志】里却能看到&#xff1a; ✅ 发送成功❌ 发送失败同时【接收状态】又常常显示“…

Memcached vs Redis:面试必看的彻底解析

文章目录Memcached 与 Redis 的区别&#xff1f;闫工来告诉你&#xff01;一、Memcached&#xff1a;轻量级缓存界的“闪电侠”1.1 Memcached 的特点1.2 Memcached 的适用场景1.3 Memcached 的配置与使用示例二、Redis&#xff1a;全能型的“瑞士军刀”2.1 Redis 的特点2.2 Red…