【Python/Java/C++三种语言】20天拿下华为OD笔试之【位运算】2023B-出错的或电路【欧弟算法】全网注释最详细分类最全的华为OD真题
文章目录
- 题目描述与示例
- 题目描述
- 输入描述
- 输出描述
- 示例一
- 输入
- 输出
- 说明
- 示例二
- 输入
- 输出
- 说明
- 解题思路
- 代码
- Python
- Java
- C++
- 时空复杂度
- 华为OD算法/大厂面试高频题算法练习冲刺训练
题目描述与示例
题目描述
某生产门电路的厂商发现某一批次的或门电路不稳定,具体现象为计算两个二进制数的或操作时,第一个二进制数中某两个比特位会出现交换,交换的比特位置是随机的,但只交换这两个位,其他位不变。
很明显,这个交换可能会影响最终的或结果,也可能不会有影响。
为了评估影响和定位出错的根因,工程师需要研究在各种交换的可能下,最终的或结果发生改变的情况有多少种。
输入描述
第一行有一个正整数 N
;其中 1 ≤ N ≤ 1000000
。
第二行有一个长为 N
的二进制数,表示与电路的第一个输入数,即会发生比特交换的输入数。
第三行有一个长为 N
的二进制数,表示与电路的第二个输入数。注意第二个输入数不会发生比特交换。
输出描述
输出只有一个整数,表示会影响或结果的交换方案个数。
示例一
输入
3
010
110
输出
1
说明
原本 010
和 110
的或结果是 110
,但第一个输入数可能会发生如下三种交换:
- 交换第
1
个比特和第2
个比特,第一个输入数变为100
,计算结果为110
,计算结果不变 - 交换第
1
个比特和第3
个比特,第一个输入数变为010
,计算结果为110
,计算结果不变 - 交换第
2
个比特和第3
个比特,第一个输入数变为001
,计算结果为111
,计算结果改变
故只有一种交换会改变计算结果。
示例二
输入
6
011011
110110
输出
4
说明
原本 011011
和 110110
的或结果是 111111
,但第一个输入数发生如下比特交换会影响最终计算结果:
- 交换第
1
个比特和第3
个比特,第一个输入数变为110011
,计算结果变为110111
- 交换第
1
个比特和第6
个比特,第一个输入数变为111010
,计算结果变为111110
- 交换第
3
个比特和第4
个比特,第一个输入数变为010111
,计算结果变为110111
- 交换第
4
个比特和第6
个比特,第一个输入数变为011110
,计算结果变为111110
其他的交换都不会影响计算结果,故输出 4
。
解题思路
第一个二进制数我们记为num1
,第二个二进制数我们记为num2
,或运算的结果记为num_or
。对num1
所选取的两个位置记为i
和j
。
如果num1[i]
和num1[j]
交换之后或运算的结果和之前的不一致,说明交换的两个位置必定满足以下条件:
num1[i] != num1[j]
,即交换的两个数必须是一个0
一个1
,不能均为0
或者均为1
。因为如果num1[i] == num1[j]
,说明交换前后的num1
是一致的,与num2
进行位运算得到的结果的num_or
自然也是一致的。num2[i]
和num2[j]
不能均为1
,即num2
的对应位置,至少有存在1
个0
。因为如果存在num2[i] == num2[j] == 1
,那么无论num1[i]
和num1[j]
是什么内容,或运算的结果一定存在num_or[i] == num_or[j] == 1
,不会因为num1[i]
和num1[j]
的交换而改变。
简单来说:
num1
的两个位置必须是一个0
和一个1
。num2
的两个位置必须至少有一个0
。
因此,如果num_or
在交换前后出现改变,那么只可能是以下三种情况。
num1的情况 | num2的情况 | num_or交换前 | num_or交换后 |
---|---|---|---|
num1[i] = 1``num1[j] = 0 | num2[i] = 0``num2[j] = 0 | num1[i] = 1``num1[j] = 0 | num1[i] = 0``num1[j] = 1 |
num1[i] = 1``num1[j] = 0 | num2[i] = 1``num2[j] = 0 | num1[i] = 1``num1[j] = 0 | num1[i] = 1``num1[j] = 1 |
num1[i] = 1``num1[j] = 0 | num2[i] = 0``num2[j] = 1 | num1[i] = 1``num1[j] = 1 | num1[i] = 0``num1[j] = 1 |
由于i
和j
两者的地位是等价的,因此我们只需要求出以下四种情况下的索引i
的个数
num1[i] == 1
,num2[i] == 1
的i
的个数,记为cnt11
。num1[i] == 0
,num2[i] == 0
的i
的个数,记为cnt00
。num1[i] == 1
,num2[i] == 0
的i
的个数,记为cnt10
。num1[i] == 0
,num2[i] == 1
的i
的个数,记为cnt01
。
上述表格中的三种情况的个数,根据乘法原理,分别对应
cnt10 * cnt00
cnt11 * cnt00
cnt10 * cnt01
再将上述三者的结果相加,即为答案。
代码
Python
# 题目:2023B-出错的或电路
# 分值:200
# 作者:闭着眼睛学数理化
# 算法:数学/乘法原理
# 代码看不懂的地方,请直接在群上提问n = int(input())
num1 = input()
num2 = input()# 初始化四个变量,分别统计四种情况
cnt11, cnt00, cnt10, cnt01 = 0, 0, 0, 0
for i in range(n):# 分别根据num1[i]和num2[i]的情况# 统计对应变量的个数if num1[i] == "1" and num2[i] == "1":cnt11 += 1elif num1[i] == "0" and num2[i] == "0":cnt00 += 1elif num1[i] == "1" and num2[i] == "0":cnt10 += 1elif num1[i] == "0" and num2[i] == "1":cnt01 += 1# 根据乘法原理,进行计算
ans = cnt10 * cnt00 + cnt11 * cnt00 + cnt10 * cnt01
print(ans)
Java
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();String num1 = scanner.next();String num2 = scanner.next();int cnt11 = 0, cnt00 = 0, cnt10 = 0, cnt01 = 0;for (int i = 0; i < n; i++) {if (num1.charAt(i) == '1' && num2.charAt(i) == '1') {cnt11++;} else if (num1.charAt(i) == '0' && num2.charAt(i) == '0') {cnt00++;} else if (num1.charAt(i) == '1' && num2.charAt(i) == '0') {cnt10++;} else if (num1.charAt(i) == '0' && num2.charAt(i) == '1') {cnt01++;}}int ans = cnt10 * cnt00 + cnt11 * cnt00 + cnt10 * cnt01;System.out.println(ans);}
}
C++
#include <iostream>
using namespace std;int main() {int n;cin >> n;string num1, num2;cin >> num1 >> num2;int cnt11 = 0, cnt00 = 0, cnt10 = 0, cnt01 = 0;for (int i = 0; i < n; i++) {if (num1[i] == '1' && num2[i] == '1') {cnt11++;} else if (num1[i] == '0' && num2[i] == '0') {cnt00++;} else if (num1[i] == '1' && num2[i] == '0') {cnt10++;} else if (num1[i] == '0' && num2[i] == '1') {cnt01++;}}int ans = cnt10 * cnt00 + cnt11 * cnt00 + cnt10 * cnt01;cout << ans << endl;return 0;
}
时空复杂度
时间复杂度:O(N)
。一次遍历求出四个变量的情况。
空间复杂度:O(1)
。仅需若干常数变量
华为OD算法/大厂面试高频题算法练习冲刺训练
-
华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!
-
课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化
-
每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!
-
60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁
-
可上全网独家的欧弟OJ系统练习华子OD、大厂真题
-
可查看链接 大厂真题汇总 & OD真题汇总(持续更新)
-
绿色聊天软件戳
od1336
了解更多
相关文章:

【Python/Java/C++三种语言】20天拿下华为OD笔试之【位运算】2023B-出错的或电路【欧弟算法】全网注释最详细分类最全的华为OD真题
文章目录 题目描述与示例题目描述输入描述输出描述示例一输入输出说明 示例二输入输出说明 解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 某生产门电路的厂商发现某一批次的或门电路不稳定,具体现象为计…...

vscode 编译运行c++ 记录
一、打开文件夹,新建或打开一个cpp文件 二、ctrl shift p 进入 c/c配置 进行 IntelliSense 配置。主要是选择编译器、 c标准, 设置头文件路径等,配置好后会生成 c_cpp_properties.json; 二、编译运行: 1、选中ma…...

错题总结(四)
1.【一维数组】输入10个整数,求平均值 编写一个程序,从用户输入中读取10个整数并存储在一个数组中。然后,计算并输出这些整数的平均值。 int main() {int arr[10];int sum 0;for (int n 0; n < 10; n){scanf("%d", &arr…...

ORACLE使用Mybatis-plus批量插入
ORACLE使用mybatis-plus自带的iservice.saveBatch方法时,会报DML Returing cannot be batch错误: 推测原因是oracle不支持insert into table_name (,) values (,),()的写法。且oracle不会自动生…...

vue,uniapp的pdf等文件在线预览
vue,uniapp文件在线预览方案,用了个稍微偏门一点的方法实现了 通过后端生成文件查看页面,然后前端只要展示这个网页就行,uniapp就用web-view来展示,后台系统就直接window.open()打开就行 示例查看PDF文件,…...

SpringBoot 项目 Jar 包加密,防止反编译
1场景 最近项目要求部署到其他公司的服务器上,但是又不想将源码泄露出去。要求对正式环境的启动包进行安全性处理,防止客户直接通过反编译工具将代码反编译出来。 2方案 第一种方案使用代码混淆 采用proguard-maven-plugin插件 在单模块中此方案还算简…...

DockerFile中途执行出错的解决办法
DockerFile中途执行出错的解决办法 你们是否也曾经因为DockerFile中途执行出错,而对其束手无策?总是对docker避之不及! 但是当下载的源码运用到了docker,dockerFile 执行到一半,报错了怎么办? 现状 那么当DockerFile执行一半出错后,会产生什么结果呢? 如图可知,生成…...

Word插件-好用的插件-一键设置字体--大珩助手
常用字体 整理了论文、公文常用字体 整理了常用的论文字体,可一键设置当前节或选择的文字的字体 字体设置 包含字体选择、字体颜色 特殊格式 包含首字下沉、段落分栏、统一宽度、双行合一、上标切换、下标切换、转为全角、转为半角、挖词填空、当前日期、大写金…...

【MODBUS】Modbus主站云端服务器和边缘设备部署区别
Modbus主站作为云端服务器: 云端服务器作为主站: 在这种部署方式中,云端服务器充当Modbus通信的主站,负责向不同的Modbus从站发起请求,并处理响应。云端服务器通常与其他云服务一起运行,可以在云平台上实现…...

hbuiler中使用npm安装datav
注:datav边框样式目前使用时:适用于网页,不适用于app 1、先安装node 安装、配置Node路径 2、为Node配置环境变量 3、在hbuilder的设置中填写node的路径 配置 4、打开cmd输入npm install jiaminghi/data-view 安装dataV,&…...

贾佳亚团队新作LLaMA-VID,2token让大模型学会看好莱坞大片
家人们谁懂,连大模型都学会看好莱坞大片了,播放过亿的GTA6预告片大模型还看得津津有味,实在太卷了! 而让LLM卷出新境界的办法简单到只有2token——将每一帧编码成2个词即可搞定。等等!这种大道至简的方法有种莫名的熟…...

【数据结构】手撕排序
🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 一、排序的概念及其运用1.1 排序的概念1.2 常见的算法排序 二、 冒泡排序三、直接插入排…...

运维05:自动化
人工运维时代 运维人员早期需要维护众多的机器,因此需要执行很多重复的劳动,很多机器需要同时部署相同的服务或者是执行相同的命令,还得反复地登录不同的机器,执行重复的动作 自动化运维时代 早期运维人员会结合ssh免密登录&…...

OpenCL学习笔记(一)开发环境搭建(win10+vs2019)
前言 异构编程开发,在高性能编程中有重要的,笔者本次只简单介绍下,如何搭建简单的开发环境,可以供有需要的小伙伴们开发测试使用 一、获取opencl的sdk库 1.使用cuda库 若本机有Nvidia的显卡,在安装cuda库后&#x…...

寻找两个正序数组的中位数
更好的阅读体验,请点击 YinKai s Blog。 题目:寻找两个正序数组的中位数 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 …...

探索低代码的潜力、挑战与未来展望
低代码开发作为一种新兴的开发方式,正在逐渐改变着传统的编程模式,低代码使得开发者无需编写大量的代码即可快速构建各种应用程序。然而,低代码也引发了一系列争议,有人称赞其为提升效率的利器,也有人担忧其可能带来的…...

unity 2d 入门 飞翔小鸟 小鸟碰撞 及死亡(九)
1、给地面,柱体这种添加2d盒装碰撞器,小鸟移动碰到就不会动了 2、修改小鸟的脚本(脚本命名不规范,不要在意) using System.Collections; using System.Collections.Generic; using UnityEngine;public class Fly : Mo…...

实时最优控制(Real-Time Optimal Control)工具
系列文章目录 前言 许多现代控制方法,如模型预测控制(model-predictive control),在很大程度上依赖于实时解决优化问题。特别是,高效解决优化控制问题的能力使复杂机器人系统在实现高动态行为(highly dyna…...

(env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
应公司需求,在特定情况下需要修改ip 在开发过程中出现的小插曲 1、第一种情况:重复声明 2、第二种情况: 应官方要求,需要跳转的 tabBar 页面的路径(需在 pages.json 的 tabBar 字段定义的页面)࿰…...

go-zero开发入门-API服务开发示例
接口定义 定义 API 接口文件 接口文件 add.api 的内容如下: syntax "v1"info (title: "API 接口文件示例"desc: "演示如何编写 API 接口文件"author: "一见"date: "2023年12月07日"version: "…...

NVIDIA Jetson NX ubuntu20.04删除多余版本冲突的Boost库
参考Ubuntu16.04 卸载旧版本Boost库并安装新版本 卸载 删除/usr/local/include/boost文件夹,删除/usr/local/lib中和boost有关的文件,以及/usr/local/lib/cmake/中boost的cmake文件 cd /usr/local/lib/ ls | grep boost sudo rm -rf /usr/local/include/boost su…...

【蜗牛到家】获南明电子信息产业引导基金战略投资
智慧社区生活服务平台「蜗牛到家」已于近期获得贵阳南明电子信息产业引导基金、华科明德战略投资。 贵阳南明电子信息产业引导基金属于政府旗下产业引导基金,贵州华科明德基金管理有限公司擅长电子信息产业、高科技产业、城市建设及民生保障领域的投资,双…...

基于ubuntu nc指令实现远程传输文件到嵌入式设备中
背景: 最近在使用nc进行远程文件传输的时候发现在文件传输完成时,没有正确的反馈,而是界面一直停留在传输阶段,加上使用nc传输需要设置一些诸如-l、 -p等参数,于是想将这些参数包裹在sh脚本中,一键执行脚本…...

蓝桥杯 day01 奇怪的数列 特殊日期
奇怪的数列 题目描述 奇怪的数列 从 X 星截获一份电码,是一些数字,如下: 13 1113 3113 132113 1113122113 ⋯⋯ YY 博士经彻夜研究,发现了规律: 第一行的数字随便是什么,以后每一行都是对上一行…...

properties配置和读取
如何配置和读取属性文件 1.属性文件介绍1.1 什么是属性文件1.2属性文件规范1.3 属性文件优缺点 2.属性文件读取4.spring和属性文件4.1利用注解读取4.2配置文件里直接引用 4.属性文件写入5.注意事项5.总结 1.属性文件介绍 1.1 什么是属性文件 Java开发中,我们经常需…...

如何利用人工智能+物联网技术实现自动化设备生产
随着科技的发展与行业竞争的日益激烈,制造业也逐渐走向智能化发展。制造业的改革是利用物联网技术和自动化设备,实现生产线的智能化和自适应生产,优化生产流程,提高生产效率和质量,为企业创造更大的价值。 方案概述 智…...

STM32CubeMx+MATLAB Simulink串口输出实验
STM32CubeMxMATLAB Simulink串口输出实验 📌《STM32CubeMxMATLAB Simulink点灯程序》📍相关篇《MATLAB Simulink STM32硬件在环 (HIL)实现例程测试》🔖需要的软件支持包:Embedded Coder Support Package fo…...

React中每次渲染都会传入一个新的props.children到子组件?
传入props.children后, 为什么会导致组件的重新渲染? 问题描述 在 react 中, 我想要对组件的渲染进行优化, 遇到了一个非常意思的问题, 当我向一个组件中传入了 props.children 之后, 每次父组件重新渲染都会导致这个组件的重新渲染; 它看起来的表现就像是被memo包…...

Qt 通过命令行编译程序
前言 从服务器拉代码到编译成可执行文件一个脚本解决问题。使用的项目文件见上一个文章 Qt生成动态链接库并使用动态链接库 脚本代码 为了方便易懂这是一个很简单的Qt编译脚本 call E:\vs2015\VC\vcvarsall.bat x86 rmdir /s /q my-project git clone gitgitee.com:wenbai1…...

WireShark监控浏览器登录过程网络请求
软件开发中经常前后端扯皮。一种是用Chrome浏览器的开发者工具 来看网络交互,但是前提是 网络端口的确是通的。 WireShark工作在更低层。 这个工具最大的好处,大家别扯皮,看网络底层的log,到底 你的端口开没开, 数据…...