目錄
範例
方法 1
演算法
輸出
首頁 後端開發 C++ 將給定的二進位字串轉換為另一個二進位字串,最少運算元為翻轉除一個以外的所有位

將給定的二進位字串轉換為另一個二進位字串,最少運算元為翻轉除一個以外的所有位

Sep 04, 2023 pm 11:13 PM
轉換 操作數 二進位字串

將給定的二進位字串轉換為另一個二進位字串,最少運算元為翻轉除一個以外的所有位

在這個問題中,我們需要透過翻轉字串的字符,將一個二進位字串轉換為另一個二進位字串。我們可以保存任何設定的位元並翻轉其他位,並且我們需要計算總操作以通過這樣做來實現另一個字串。

我們可以根據給定字串中「01」和「10」對的總數來解決問題。

問題陳述- 我們給了兩個長度相同的字串,分別名為 str1 和 str2,包含「0」和「1」字符,表示二進位字串。我們需要透過執行以下操作將字串 str1 轉換為 str2。

  • 我們可以選擇任何設定的位元並翻轉所有其他位元。翻轉位元意味著將“0”轉換為“1”,將“1”轉換為“0”。

  • 如果無法將 str1 轉換為 str2,則列印 -1。

範例

輸入

str1 = "001001111", str2 = "011111000";
登入後複製

輸出

3
登入後複製

解釋

  • 在第一個操作中,我們保持第二個索引的「1」不變,並翻轉 str1 中的所有其他字元。因此,str1 將是 111110000。

  • 在第二個操作中,我們保持第 0 個索引的「1」不變,並翻轉所有其他字元。因此,str1 將是 100001111。

  • 在最後一個操作中,我們將「1」保存在第 5 個索引處。因此,str1 將變為 011111000。

輸入

 str1 = "0000", str2 = "1111";
登入後複製

輸出

-1
登入後複製
登入後複製

解釋- 無法將 str1 轉換為 str2,因為 str1 不包含任何要儲存的「1」字元。

輸入

 str1 = "0111", str2 = "1000";
登入後複製

輸出

-1
登入後複製
登入後複製

說明- 無法將 str1 轉換為 str2。

方法 1

我們可以透過觀察來​​解決問題。觀察結果是,當我們持有任何單一設定位並執行 2 個操作時,我們可以獲得相同的字串。因此,我們需要選擇不同的1索引來對字串進行更改。

此外,我們需要執行 2 次操作才能將 01 對轉換為 10。例如,將“1”保留在“01”中。所以,我們得到「11」。之後,將「1」保留在「11」中的第 0 個索引處,這樣我們就會得到「10」。

要得到答案,01 ( 0 -> str1, 1 -> str2) 和 10 ( 1 -> str1, 0 -> str2) 應該是相同的。否則,我們可以說答案不存在。

我們的主要目標是最小化「01」和「10」對,因為我們可以透過 2 次運算將「01」轉換為「10」。

演算法

第 1 步- 定義totalOperatrions() 函數來計算將str1 轉換為str2 所需的運算元。

步驟 1.2 - 初始化 count10 和 count01 變數以將「01」和「10」對儲存在字串中。

步驟 1.3 - 遍歷字串並計算兩個字串中的 01 和 10 對。

步驟 1.4− 如果 count10 和 count01 相同,則傳回 2*count10。否則返回-1。

第 2 步- 定義minimumOperations() 函數來計算將 str1 轉換為 str2 所需的最少操作。

第 3 步- 用最大值初始化「ans」。

第 4 步- 使用原始字串呼叫totalOperations() 函數,並將結果儲存在「operation1」變數中。如果傳回值不等於-1,則將ans和操作1中的最小值儲存在ans中。

第 5 步- 現在,我們將修改字串以最小化 01 和 10 對。因此,定義 stringModification() 函數。

步驟 5.1 - 在函數中,我們找到字串中的第一對“1ch”,並將“ch”作為參數傳遞,可以是“0”或“1”。因此,該對應該類似於 1 -> str1 和 ch -> str。

步驟 5.2- 如果找不到「1ch」對,則傳回 false。

步驟 5.3 − 如果找到「1ch」對,則保持該對不變並翻轉 str1 的其他字元。

第 6 步- 執行 stringModification 函數以保持「11」對不變並翻轉其他字元。之後,再次呼叫totalOperations()函數來尋找將str1轉換為str2所需的操作。

第 7 步− 如果操作 2 不等於 -1,則將「ans」或「1 操作 2」中的最小值儲存在「ans」中。這裡,我們添加了 1,因為我們使用了一次操作修改了字串。

第 8 步- 透過保持第一個「10」對不變來修改字串,並計算運算元。再次為“ans”分配最小值。

步驟 9− 如果「ans」等於 INT_MAX,則傳回 −1。否則,返回 ans。

範例

#include <bits/stdc++.h>
using namespace std;

// counting 01 and 10 pairs
int totalOperations(string str1, string str2) {
    int len = str1.size();
    int count10 = 0, count01 = 0;
    for (int p = 0; p < len; p++) {
        // If characters at p index are not same
        if (str1[p] != str2[p]) {
            // Increase count01 if 0(str1)-1(str2), else count10 if 1(str1)-0(str2)
            if (str1[p] == '0')
                count01++;
            else
                count10++;
        }
    }
    // If we have euqal number of 01 and 10 pairs, we need 2 operations to flip one pair.
    if (count01 == count10)
        return 2 * count01;
    return -1;
}
bool StringModification(string &temp1, string &temp2, char ch) {
    int len = temp1.size();
    int index = -1;
    // Find the pair of 1c character. (1 -> temp1, c -> temp2)
    for (int p = 0; p < len; p++) {
        if (temp1[p] == '1' && temp2[p] == ch) {
            index = p;
            break;
        }
    }
    // return 0 if pair is not found
    if (index == -1)
        return false;
    // Flip other characters in both strings
    for (int p = 0; p < len; p++) {
        if (p != index) {
            if (temp1[p] == '1')
                temp1[p] = '0';
            else
                temp1[p] = '1';
        }
    }
    return true;
}
// finding minimum operations
int minimumOperations(string str1, string str2) {
    int ans = INT_MAX;
    // first case with initial strings
    int operation1 = totalOperations(str1, str2);
    if (operation1 != -1)
        ans = min(ans, operation1);
    string temp1 = str1, temp2 = str2;
    // Case 2, modification for 11 pair
    if (StringModification(temp1, temp2, '1')) {
        // get operations after modification
        int operation2 = totalOperations(temp1, temp2);
        // adding 1 to operation2 as we have done one modification initially
        if (operation2 != -1)
            ans = min(ans, 1 + operation2);
    }
    // Case 3 modification for 10 pair
    temp1 = str1, temp2 = str2;
    if (StringModification(temp1, temp2, '0')) {
        int operation3 = totalOperations(temp1, temp2);
        if (operation3 != -1)
            ans = min(ans, 1 + operation3);
    }
    if (ans == INT_MAX)
        return -1;
    else
        return ans;
}
int main() {
    string str1 = "001001111";
    string str2 = "011111000";
    int ans = minimumOperations(str1, str2);
    if (ans == -1){
        cout << "S1 to S2 conversion is not possible";
    }
    else{
        cout << "Minimum number of operations required are: " << ans << "\n";
    }
    return 0;
}

登入後複製

輸出

Minimum number of operations required are: 3
登入後複製

時間複雜度− O(N),因為我們在 stringModification() 和totalOperations() 函數中遍歷字串。

空間複雜度− O(1),因為我們修改相同的字串而不使用任何額外的空間。

在程式碼中,我們的主要目的是在修改字串後,減少給定字串中01和10對的數量,以盡量減少操作。程式設計師可以使用各種輸入並嘗試理解答案。

以上是將給定的二進位字串轉換為另一個二進位字串,最少運算元為翻轉除一個以外的所有位的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
USDT ERC20轉換為TRC20的簡易指南 USDT ERC20轉換為TRC20的簡易指南 Jan 18, 2024 pm 06:09 PM

我們逐步教您如何將USDTERC20轉換為TRC20網路。這是因為許多人喜歡將USDT穩定幣從以太坊網路轉移到Tron網絡,以節省交易費用。因此,如果您想將您的ERC-20代幣轉換為TRC-20,相信本教學會對您有所幫助。 ERC-20和TRC-20的區別ERC-20代幣和TRC-20代幣分別代表基於以太坊網路和Tron網路的代幣。這兩個網路之間存在一些差異,主要表現在以下方面:首先,以太坊網路常常面臨擁塞和高昂的汽油費問題,這可能導致交易延遲和高昂的交易成本。相較之下,Tron網路則相對壅塞較少

全角英文字母轉換為半角形式的實用技巧 全角英文字母轉換為半角形式的實用技巧 Mar 26, 2024 am 09:54 AM

全角英文字母轉換為半角形式的實用技巧在現代生活中,我們經常會接觸到英文字母,在使用電腦、手機等設備時也經常需要輸入英文字母。然而,有時候我們會遇到全角英文字母的情況,而我們需要使用的是半角形式。那麼,如何將全角英文字母轉換為半角形式呢?以下就為大家介紹一些實用的技巧。首先,全角英文字母和數字是指在輸入法中佔據一個全角位置的字符,而半角英文字母和數字則是佔據一

Golang時間處理:如何在Golang中將時間戳轉換為字串 Golang時間處理:如何在Golang中將時間戳轉換為字串 Feb 24, 2024 pm 10:42 PM

Golang時間轉換:如何將時間戳轉換為字串在Golang中,時間操作是非常常見的操作之一。有時候我們需要將時間戳記轉換為字串,以便於展示或儲存。本文將介紹如何使用Golang將時間戳轉換為字串,並提供具體的程式碼範例。 1.時間戳和字串的轉換在Golang中,時間戳通常是以整數數字的形式表示的,表示的是從1970年1月1日至當前時間的秒數。而字串則

如何將AI檔案轉換為CDR格式 如何將AI檔案轉換為CDR格式 Feb 19, 2024 pm 04:09 PM

AI檔案指的是AdobeIllustrator(簡稱AI)軟體所建立的向量圖形文件,而CDR檔案指的是CorelDRAW軟體所建立的向量圖形檔。由於這兩個軟體屬於不同的廠商開發,因此它們的文件格式不同,無法直接相互轉換。然而,我們可以透過一些方法將AI檔案轉換為CDR檔案。以下將介紹一種常用的轉換方法。步驟一:匯出AI檔案為EPS格式AdobeIllust

如何將虛擬機器轉換為實體機器? 如何將虛擬機器轉換為實體機器? Feb 19, 2024 am 11:40 AM

將虛擬機器(VM)轉換為實體機器是一種將虛擬實例和關聯的應用軟體遷移到實體硬體平台的過程。這種轉換有助於優化作業系統的效能和硬體資源利用。本文旨在深入探討如何進行這種轉換。如何實現從虛擬機器到實體機器的遷移?通常,虛擬機器與實體機之間的轉換過程由第三方軟體在虛擬機器外部執行。這個過程包括多個階段,涉及虛擬機器的配置和資源轉移。準備實體機器:第一步是確保實體機符合Windows的硬體需求。我們需要在實體機上備份數據,因為轉換過程將覆蓋現有數據。 *管理員帳戶的使用者名稱和密碼,具有建立系統映像的管理員權限。將虛擬

PHP 月份轉換為英文月份的實作方法詳解 PHP 月份轉換為英文月份的實作方法詳解 Mar 21, 2024 pm 06:45 PM

這篇文章將詳細介紹如何將PHP中的月份轉換為英文月份的方法,同時給出具體的程式碼範例。在PHP開發中,有時候我們需要將數字表示的月份轉換為英文的月份,這在一些日期處理或資料展示的場景下非常實用。以下將從實作原理、具體程式碼範例和注意事項等方面進行詳解。一、實作原理在PHP中,可以透過使用DateTime類別和format方法來實現將數位月份轉換為英文月份。 Date

如何在Windows 11/10中將ODT轉換為Word? 如何在Windows 11/10中將ODT轉換為Word? Feb 20, 2024 pm 12:21 PM

在這篇文章中,我們將向您展示如何將OpenDocumentTextDocument(ODT)檔案轉換為MicrosoftWord(Docx、DOC等)。格式。如何在Windows11/10中將ODT轉換為Word以下是您可以在WindowsPC上將ODT文件轉換為DOC或DOCX格式的方法:使用寫字板或Word將ODT轉換為Word我們要向您展示的第一種方法是使用寫字板或MicrosoftWord將ODT轉換為Word。以下是實現這一點的步驟:首先,使用「開始」功能表開啟寫字板應用程式。現在,轉到

全角英文字母變成半角字母的方法 全角英文字母變成半角字母的方法 Mar 25, 2024 pm 02:45 PM

全角英文字母變成半角字母的方法在日常生活和工作中,有時候我們會遇到需要將全角英文字母轉換為半角字母的情況,例如在輸入電腦密碼、編輯文件或設計排版時。全角英文字母和數字是指寬度與中文字符相同的字符,而半角英文字母則是指寬度較窄的字符。在實際操作中,我們需要掌握一些簡單的方法,將全角英文字母轉換為半角字母,以便更方便地處理文字和數字。一、全角英文字母與半角英

See all articles