【Python/Java/C++三種語言】20天拿下華為OD筆試之【位運算】2023B-出錯的或電路【歐弟算法】全網注釋最詳細分類最全的華為OD真題

文章目錄

  • 題目描述與示例
    • 題目描述
    • 輸入描述
    • 輸出描述
    • 示例一
      • 輸入
      • 輸出
      • 說明
    • 示例二
      • 輸入
      • 輸出
      • 說明
  • 解題思路
  • 代碼
    • Python
    • Java
    • C++
    • 時空復雜度
  • 華為OD算法/大廠面試高頻題算法練習沖刺訓練

題目描述與示例

題目描述

某生產門電路的廠商發現某一批次的或門電路不穩定,具體現象為計算兩個二進制數的或操作時,第一個二進制數中某兩個比特位會出現交換,交換的比特位置是隨機的,但只交換這兩個位,其他位不變。

很明顯,這個交換可能會影響最終的或結果,也可能不會有影響。

為了評估影響和定位出錯的根因,工程師需要研究在各種交換的可能下,最終的或結果發生改變的情況有多少種。

輸入描述

第一行有一個正整數 N;其中 1 ≤ N ≤ 1000000

第二行有一個長為 N 的二進制數,表示與電路的第一個輸入數,即會發生比特交換的輸入數。

第三行有一個長為 N 的二進制數,表示與電路的第二個輸入數。注意第二個輸入數不會發生比特交換。

輸出描述

輸出只有一個整數,表示會影響或結果的交換方案個數。

示例一

輸入

3
010
110

輸出

1

說明

原本 010110 的或結果是 110,但第一個輸入數可能會發生如下三種交換:

  1. 交換第 1 個比特和第 2 個比特,第一個輸入數變為 100,計算結果為 110,計算結果不變
  2. 交換第 1 個比特和第 3 個比特,第一個輸入數變為 010,計算結果為 110,計算結果不變
  3. 交換第 2 個比特和第 3 個比特,第一個輸入數變為 001,計算結果為 111,計算結果改變

故只有一種交換會改變計算結果。

示例二

輸入

6
011011
110110

輸出

4

說明

原本 011011110110 的或結果是 111111,但第一個輸入數發生如下比特交換會影響最終計算結果:

  1. 交換第 1 個比特和第 3 個比特,第一個輸入數變為 110011,計算結果變為 110111
  2. 交換第 1 個比特和第 6 個比特,第一個輸入數變為 111010,計算結果變為 111110
  3. 交換第 3 個比特和第 4 個比特,第一個輸入數變為 010111,計算結果變為 110111
  4. 交換第 4 個比特和第 6 個比特,第一個輸入數變為 011110,計算結果變為 111110

其他的交換都不會影響計算結果,故輸出 4

解題思路

第一個二進制數我們記為num1,第二個二進制數我們記為num2,或運算的結果記為num_or。對num1所選取的兩個位置記為ij

如果num1[i]num1[j]交換之后或運算的結果和之前的不一致,說明交換的兩個位置必定滿足以下條件:

  1. num1[i] != num1[j],即交換的兩個數必須是一個0一個1,不能均為0或者均為1。因為如果num1[i] == num1[j],說明交換前后的num1是一致的,與num2進行位運算得到的結果的num_or自然也是一致的。
  2. num2[i]num2[j]不能均為1,即num2的對應位置,至少有存在10。因為如果存在num2[i] == num2[j] == 1,那么無論num1[i]num1[j]是什么內容,或運算的結果一定存在num_or[i] == num_or[j] == 1,不會因為num1[i]num1[j]的交換而改變。

簡單來說:

  1. num1的兩個位置必須是一個0和一個1
  2. num2的兩個位置必須至少有一個0

因此,如果num_or在交換前后出現改變,那么只可能是以下三種情況。

num1的情況num2的情況num_or交換前num_or交換后
num1[i] = 1``num1[j] = 0num2[i] = 0``num2[j] = 0num1[i] = 1``num1[j] = 0num1[i] = 0``num1[j] = 1
num1[i] = 1``num1[j] = 0num2[i] = 1``num2[j] = 0num1[i] = 1``num1[j] = 0num1[i] = 1``num1[j] = 1
num1[i] = 1``num1[j] = 0num2[i] = 0``num2[j] = 1num1[i] = 1``num1[j] = 1num1[i] = 0``num1[j] = 1

由于ij兩者的地位是等價的,因此我們只需要求出以下四種情況下的索引i的個數

  1. num1[i] == 1num2[i] == 1i的個數,記為cnt11
  2. num1[i] == 0num2[i] == 0i的個數,記為cnt00
  3. num1[i] == 1num2[i] == 0i的個數,記為cnt10
  4. num1[i] == 0num2[i] == 1i的個數,記為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了解更多

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212155.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212155.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212155.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于SpringBoot+Vue的學校在線學習系統

開發環境 IDEA JDK1.8 MySQL8.0Node 系統簡介 本系統擁有管理員&#xff0c;教師&#xff0c;學生三種身份登錄&#xff0c;管理員登錄可以查看所有信息&#xff0c;教師登錄可以發布作業&#xff0c;查看試卷&#xff0c;回答問題等&#xff0c;學校登錄可以查看作業&…

【矩陣論】Chapter 6—矩陣分解知識點總結復習(附Python實現)

文章目錄 1 滿秩分解&#xff08;Full-Rank Factorization&#xff09;2 三角分解&#xff08;Triangular Factorization&#xff09;3 正交三角分解&#xff08;QR Factorization&#xff09;4 奇異值分解&#xff08;SVD&#xff09; 1 滿秩分解&#xff08;Full-Rank Factor…

react.js源碼二

三、調度Scheduler scheduling(調度)是fiber reconciliation的一個過程&#xff0c;主要決定應該在何時做什么?在stack reconciler中&#xff0c;reconciliation是“一氣呵成”&#xff0c;對于函數來說&#xff0c;這沒什么問題&#xff0c;因為我們只想要函數的運行結果&…

什么是CDN?用了CDN一定會更快嗎?

文章目錄 前言CDN是什么?CDN的工作原理為什么要加個CNAME那么麻煩&#xff1f;怎么知道哪個服務器IP里調用方最近&#xff1f; 回源是什么回源是什么&#xff1f;那還有哪些情況會發生回源呢&#xff1f; 怎么判斷是否發生回源用了CDN一定比不用的更快嗎&#xff1f;什么情況下…

光伏電站全貌

光伏電站 簡介 每一篇文章開篇我都會寫一個內容簡介&#xff0c;一來梳理自己的寫作思路&#xff0c;二來方便讀者整體了解文章寫作意圖和脈絡。本篇是新能源方面的開篇之作&#xff0c;我選取了介紹光伏電站基礎知識&#xff0c;首先我們要了解光伏電站基礎分類&#xff0c;然…

PHP基礎 - 運算符

算術運算符 運算符描述實例+加法$x = 2 + 2; echo $x;-減法$x = 5 - 3; echo $x;*乘法$x = 4 * 3; echo $x;/除法$x = 10 / 2; echo $x;%取余$x = 15 % 4; echo $x;++自增$x = 5; $x++; echo $x;--自減$x = 5; $x--; echo $x;算術運算符的使用場景: 1)加法運算符 +:用于將兩…

Copilot的11個新功能,你不能錯過!

我的新書《Android App開發入門與實戰》已于2020年8月由人民郵電出版社出版&#xff0c;歡迎購買。點擊進入詳情 文章目錄 1. PowerPoint2. Excel3. One Note4. Word5. 必應聊天現在變為Copilot6. GPT-4為Copilot聊天提供動力7. Microsoft Teams8. Outlook9. Copilot Studio10.…

磁盤存儲器

目錄 1.1 磁盤存儲器1.2 磁盤的性能指標1.3 磁盤存儲器(續)1.4 磁盤陣列 \quad \quad \quad 左南右北為0 左北右南為1 \quad \quad 1.1 磁盤存儲器 \quad 磁盤的驅動器 \quad 磁盤的控制器 \quad 主機每次對磁盤進行讀和寫操作都是以扇區為單位的 現在比較流行的是SATA標準 \…

【kafka實踐】12|如何實現exactly once

前面的章節中我們聊到如何避免保證消息丟失&#xff0c;沒有印象的同學可以再看看&#xff0c;本節我們將展開如何實現kafka的一次精確。 首先我們需要明白兩個概念“冪等”和“事物” 冪等 “冪等”這個詞原是數學領域中的概念&#xff0c;指的是某些操作或函數能夠被執行多…

基于SpringBoot 2+Layui實現的管理后臺系統源碼+數據庫+安裝使用說明

springboot-plus 一個基于SpringBoot 2 的管理后臺系統,包含了用戶管理&#xff0c;組織機構管理&#xff0c;角色管理&#xff0c;功能點管理&#xff0c;菜單管理&#xff0c;權限分配&#xff0c;數據權限分配&#xff0c;代碼生成等功能 相比其他開源的后臺系統&#xff0…

vue 實現返回頂部功能-指定盒子滾動區域

vue 實現返回頂部功能-指定盒子滾動區域 html代碼css代碼返回頂部顯示/隱藏返回標志 html代碼 <a-icontype"vertical-align-top"class"top"name"back-top"click"backTop"v-if"btnFlag"/>css代碼 .top {height: 35px;…

令牌桶算法理解學習(限流算法)

令牌桶算法是網絡流量整形&#xff08;Traffic Shaping&#xff09;和速率限制&#xff08;Rate Limiting&#xff09;中最常使用的一種算法。典型情況下&#xff0c;令牌桶算法用來控制發送到網絡上的數據的數目&#xff0c;并允許突發數據的發送。 用簡單的話語來說就是限制…

Vscode中配置SSH

方法&#xff1a; 本地生成秘鑰&#xff0c;并將生成的秘鑰保存在服務器上 步驟&#xff1a; 一、用戶端生成秘鑰 1、在cmd中輸入ssh-keygen -t rsa&#xff0c;一直點回車即可 2、打開生成的秘鑰文件&#xff08;位置&#xff1a;C:\Users\用戶名\.ssh\id_rsa.pub&#x…

【Java】BigInteger用法

前言 在Java中&#xff0c;由于沒有long long類型。如果需要使用比long類型更大的整數數據時&#xff0c;就可以使用BigInteger類&#xff0c;它支持任意精度的整數。 創建BigInteger類型數據 Test public void test1() {Scanner scan new Scanner(System.in);//1.控制臺讀…

leetcode做題筆記2048. 下一個更大的數值平衡數

如果整數 x 滿足&#xff1a;對于每個數位 d &#xff0c;這個數位 恰好 在 x 中出現 d 次。那么整數 x 就是一個 數值平衡數 。 給你一個整數 n &#xff0c;請你返回 嚴格大于 n 的 最小數值平衡數 。 示例 1&#xff1a; 輸入&#xff1a;n 1 輸出&#xff1a;22 解釋&a…

Linux中的SNAT與DNAT實踐

Linux中的SNAT與DNAT實踐 1、SNAT的介紹1.1&#xff0c;SNAT概述1.2&#xff0c;SNAT源地址轉換過程1.3&#xff0c;SNAT轉換 2、DNAT的介紹2.1&#xff0c;DNAT概述2.2&#xff0c;DNAT轉換前提條件2.3&#xff0c;DNAT的轉換 3、防火墻規則的備份和還原4、tcpdump抓包工具的運…

騰訊再推互動微短劇,游戲的風吹向了短劇

當你看劇時不再擁有上帝視角&#xff0c;處在女主的位置上&#xff0c;你又會做出什么樣的選擇&#xff1f; 騰訊最新上線的短劇《摩玉玄奇2》在原版之外還推出了互動版&#xff0c;就給出了這樣一個新玩法。 《摩玉玄奇2》原版是普通的后宮職場微短劇&#xff0c;互動版則是…

虛擬機VMware安裝centos以及配置網絡

目錄 1、CentOS7的下載2、CentOS7的配置3、CentOS7的安裝4、CentOS7的網絡配置 4.1、自動獲取IP4.2、固定獲取IP 5、XShell連接CentO 準備工作&#xff1a;提前下載和安裝好VMware。VMware的安裝可以參考這一篇文章&#xff1a;VMware15的下載及安裝教程。 1、CentOS7的下載 …

qt 字符串操作

在 QT 中&#xff0c;你可以使用QString類來操作字符串。QString是一個模板類&#xff0c;它可以存儲不同字符集的字符串&#xff0c;并且提供了許多用于操作字符串的方法。 以下是一些常見的操作字符串的方法&#xff1a; append()方法&#xff1a;將一個字符串附加到QString的…

從零開始搭建企業管理系統(五):統一響應結果和全局異常處理

統一響應結果和全局異常處理 前言統一響應結果定義響應結構定義響應對象定義響應狀態對象統一返回響應對象定義 Controller 攔截類 全局異常處理 前言 做個功能之前我們想一下為什么要做統一響應結果和全局異常處理呢&#xff1f; 這是因為我們的項目采用的是前后端分離開發&am…