目錄
問題陳述
範例
輸入
輸出
說明
方法2
演算法
結論
首頁 後端開發 C++ 將所有0放在1之前所需的最小移動次數在二進位字串中

將所有0放在1之前所需的最小移動次數在二進位字串中

Sep 23, 2023 pm 01:29 PM
二進位字串 移動次數 放置和

將所有0放在1之前所需的最小移動次數在二進位字串中

問題陳述

我們給定了二進位字串 str,我們要求從字串中刪除最少的字符,以便我們可以將所有零放在 1 之前。

範例

輸入

str = ‘00110100111’
登入後複製

輸出

3
登入後複製

說明

這裡,我們可以透過兩種方式實現輸出3。

我們可以從字串中刪除 arr[2]、arr[3] 和 arr[5] 或 arr[4]、arr[6] 和 arr[7]。

輸入

str = ‘001101011’
登入後複製

輸出

2
登入後複製

說明

我們可以刪除 arr[4] 和 arr[6],將所有零放在 1 之前。

輸入

str = ‘000111’
登入後複製

輸出

0
登入後複製

說明

在給定的字串中,所有零都已放置在 1 之前,因此我們不需要從給定字串中刪除任何字元。

方法 1

在第一種方法中,我們將使用兩個陣列。第一個陣列將所有 1 儲存在左側,另一個陣列將所有 0 儲存在右側。之後,我們可以將兩個陣列中第 i 個索引處的元素相加,並找到最小總和。

演算法

  • 第 1 步 - 定義長度為 n 的「零」和「一」命名列表,其中 n 是我們可以使用 size() 方法取得的字串的長度。 < /p>

  • 步驟2 - 如果給定字串中的第一個字元是“1”,則將1 儲存在“ones”陣列的第0 個索引處;否則,存儲0。

  • 步驟 3 - 使用 for 迴圈從字串的第二個元素開始遍歷。在 for 迴圈中,使用根據第 i 個索引處的字串的字元將 Ones[i-1] 與 1 或 0 相加得到的結果值來初始化 Ones[i]。

  • 第 4 步 - 根據給定字串中的最後一個字符,將 1 或 0 儲存在 Zeros[n-1] 處。

  • 步驟 5 - 使用 for 迴圈從最後第二個字元開始遍歷字串,並根據字串字元更新零清單的值。

    < /里>
  • 第 6 步 - 定義「min_zeros_to_remove」變數並使用最大整數值對其進行初始化。

  • 第 7 步 - 現在,遍歷「零」和「一」清單。從零列表中的“i 1”索引和“一”列表中的“I”索引存取值。之後,加入這兩個元素。

  • 步驟 8 - 如果「min_zeros_to_remove」的值小於「min_zeros_to_remove」變數的目前值,則將其值變更為兩個陣列元素的總和。

    < /里>
  • 步驟 9 - 傳回結果值。

範例

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

int minimumZeroRemoval(string str){
   int n = str.size();
   // arrays to store the prefix sums of zeros and ones
   vector<int> zeros(n);
   vector<int> ones(n);
   // compute total number of 1s at the left of each index
   ones[0] = (str[0] == '1') ? 1 : 0;
   for (int i = 1; i < n; i++) {
      ones[i] = ones[i - 1] + ((str[i] == '1') ? 1 : 0);
   }
   // compute total number of 0s at the right of each index
   zeros[n - 1] = (str[n - 1] == '0') ? 1 : 0;
   for (int i = n - 2; i >= 0; i--){
      zeros[i] = zeros[i + 1] + ((str[i] == '0') ? 1 : 0);
   }
   // do the sum of zeros and ones for each index and return the minimum value
   int min_zeros_to_remove = INT_MAX;
   for (int i = 0; i < n - 1; i++){
      min_zeros_to_remove = min(min_zeros_to_remove, zeros[i + 1] + ones[i]);
   }
   return min_zeros_to_remove;
}
int main() {
   string str = "00110100111";
   int count = minimumZeroRemoval(str);
   cout << "The minimum number of zeros required to remove from the given string is - " << count;
   return 0;
}
登入後複製

輸出

The minimum number of zeros required to remove from the given string is - 3
登入後複製
  • 時間複雜度 - O(N),因為我們需要 for 迴圈來遍歷大小為 N 的字串和清單。

  • 空間複雜度 - O(N),因為我們使用兩個清單來儲存 1 和 0 的計數。

方法2

此方法是第一種方法的最佳化版本。在這裡,我們使用兩個變數來儲存 1 和 0 的計數,而不是列表。

演算法

  • 第 1 步 - 定義「zeros_right」變數並使用 0 進行初始化。

  • 第 2 步 - 遍歷字串,計算給定字串中「0」字元的總數,並據此更新「zero_right」變數的值。 < /p>

  • 第 3 步驟 - 定義「ones_left」變數並初始化為 0。

  • 步驟 4 - 使用 for 迴圈遍歷字串。如果字串中第 i 個索引處的字元為“1”,則將“ones_left”變數的值增加 1。否則,將「zeros_right」變數的值減少 1。

  • 第 5 步 - 如果「zeros_right Ones_left」小於「res」變數的目前值,則更新「res」變數的值。

範例

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

// function to remove zeros from the string to place all zeros before 1.
int minimumZeroRemoval(string str){
   // counting the total number of zeros in the given string
   int zeros_right = 0;
   for (int i = 0; i < str.size(); i++) {
      if (str[i] == '0')
      zeros_right += 1;
   }
   // variable to store the number of ones from left
   int ones_left = 0;
   // Size of the string
   int len = str.size();
   // variable to store the final result
   int result = INT_MAX;
   // Traverse the string from left to right
   for (int i = 0; i < len; i++){
      // If the current character is '1', then increment ones_left by 1 else, decrement zeros_right by 1
      if (str[i] == '1') {
         ones_left += 1;
      } else {
         zeros_right -= 1;
      }
      // Store the minimum result and zeros_right + ones_left in result
      result = min(result, zeros_right + ones_left);
   }
   // Return the final result
   return result;
}
int main() {
   string str = "001101011";
   int count = minimumZeroRemoval(str);
   cout << "The minimum number of zeros required to remove from the given string is - " << count;
   return 0;
}
登入後複製

輸出

The minimum number of zeros required to remove from the given string is - 2
登入後複製
  • 時間複雜度 - O(N),當我們迭代字串時。

  • 空間複雜度 - O(1),因為我們只使用常數空間。

結論

使用者學習了兩種從給定二進位字串中刪除最少字元的方法。第二種方法的程式碼更具可讀性,因為我們使用變數來儲存零和一的計數,而不是使用列表。

以上是將所有0放在1之前所需的最小移動次數在二進位字串中的詳細內容。更多資訊請關注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脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 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)

最長非遞增子序列在一個二進位字串中 最長非遞增子序列在一個二進位字串中 Sep 07, 2023 pm 11:13 PM

在這個問題中,我們需要找到給定字串的最長非遞增子序列。非遞增的意思是字元要麼相同,要麼按降序排列。由於二進位字串僅包含“0”和“1”,因此產生的字串應以“1”開頭並以“0”結尾,或以“0”或“1”開頭和結尾。為了解決這個問題,我們將統計字串每個位置的前綴“1”和後綴“0”,並找到前綴“1”和後綴“0”的最大和。問題陳述-我們給了二進位字串str。我們需要從給定的字串中找到最長的非遞增子序列。範例Input–str="010100"Output–4說明最長的非遞

使用C++編寫,找到以1開頭的二進位字串的唯一排列數量 使用C++編寫,找到以1開頭的二進位字串的唯一排列數量 Sep 05, 2023 am 09:01 AM

在給定的問題中,我們得到一個由0和1組成的字串;我們需要找出以1開頭的所有排列的總數。由於答案可能是一個巨大的數字,所以我們將其取模1000000007後輸出。 Input:str="10101001001"Output:210Input:str="101110011"Output:56我們將透過應用一些組合數學和建立一些公式來解決這個問題。解的方法在這個方法中,我們將計算0和1的數量。現在假設n是我們字串中出現的1的數量,m是我們字串中出現的0

在PHP中,pack()函數的作用是將資料轉換為二進位字串 在PHP中,pack()函數的作用是將資料轉換為二進位字串 Aug 31, 2023 pm 02:05 PM

pack()函數將資料打包到二進位字串中。語法pack(format,args)參數格式-要使用的格式。以下是可能的值-a-NUL填充字串A-空格填充字串h-十六進位字串,低半位元組在前H-十六進位字串,高半位元組在前c-帶符號字元C-無符號字元s-帶符號短字元(始終為16位,機器字節順序)S-無符號短整型(始終為16位,機器字節順序)n-無符號短整型(始終為16位,大端字節順序)v-無符號短整型(始終為16位,小端字節順序)i-有符號整數(取決於機器的大小和字節順序)I-無符號整數(取決

檢查一個字串是否可以透過交換二進位字串中具有不相等字元的索引處的字元對來形成回文字串 檢查一個字串是否可以透過交換二進位字串中具有不相等字元的索引處的字元對來形成回文字串 Sep 02, 2023 pm 08:09 PM

問題陳述我們有一個字串str和一個二進位字串B。兩個字串的長度都等於N。我們需要檢查是否可以透過在字串B中包含不相等字符的任意索引對上多次交換其字符,使字串str成為回文字串。範例範例輸入str=‘AAS’B=‘101’輸出‘YES’Explanation的中文翻譯為:解釋我們可以交換str[1]和str[2],因為B[1]和B[2]不相等。最終的字串可以是'ASA'。輸入str=‘AASS’B=‘1111’輸出‘No’Explanation的中文翻譯為:解釋我們無法讓字串回文,

計算長度為N的二進位字串,它們是子字串的重複拼接 計算長度為N的二進位字串,它們是子字串的重複拼接 Sep 07, 2023 am 10:13 AM

本文的目的是實現一個程序,用於計算由一個子字串重複連接而成的長度為N的二進位字串的數量。目標是確定透過重複連接給定文字的單一子字串,可以創建多少長度為N的二進位字串,其中N是一個正整數。問題陳述實作一個程序,用於計算重複連接子字串的長度為N的二進位字串的數量。範例範例1LetustaketheInput,N=3Output:2Explanation的中文翻譯為:解釋下面列出了長度為N=3的可行二進位字串,其中重複連接了一個子字串。 "000":Thesubstr

透過從給定的二進位字串中選擇相等長度的子字串,最大化給定函數 透過從給定的二進位字串中選擇相等長度的子字串,最大化給定函數 Aug 28, 2023 am 09:49 AM

給定兩個相同長度的二進位字串str1和str2,我們必須透過從給定的相同長度的字串中選擇子字串來最大化給定的函數值。給定的函數是這樣的-fun(str1,str2)=(len(子字串))/(2^xor(sub1,sub2))。這裡,len(substring)是第一個子字串的長度,而xor(sub1,sub2)是給定子字串的異或,因為它們是二進位字串,所以這是可能的。範例Input1:stringstr1=10110&stringstr2=11101Output:3說明我們

找到在將一個二進位字串清空(透過移除非空子字串)後,0的數量最少的玩家 找到在將一個二進位字串清空(透過移除非空子字串)後,0的數量最少的玩家 Sep 16, 2023 am 10:21 AM

在本文中,我們將討論一個有趣的問題,涉及字串操作和博弈論領域:「透過刪除非空子字串來清空二進位字串,找到剩餘0最少的玩家」。這個問題探索了使用二進位字串進行競技遊戲的概念。我們的目標是在遊戲結束後找出剩餘0最少的玩家。我們將討論這個問題,提供一個C++程式碼實現,並透過一個例子來解釋這個概念。理解問題陳述給兩個玩家一個二進位字串,他們輪流玩遊戲。在每一回合中,玩家移除至少包含一個「1」的非空子字串。當字串變空或字串中沒有“1”時,遊戲結束。無法採取行動的玩家輸掉遊戲。任務是找到最終0

將所有0放在1之前所需的最小移動次數在二進位字串中 將所有0放在1之前所需的最小移動次數在二進位字串中 Sep 23, 2023 pm 01:29 PM

問題陳述我們給定了二進位字串str,我們要求從字串中刪除最少的字符,以便我們可以將所有零放在1之前。範例輸入str=‘00110100111’輸出3說明這裡,我們可以透過兩種方式實現輸出3。我們可以從字串中刪除arr[2]、arr[3]和arr[5]或arr[4]、arr[6]和arr[7]。輸入str=‘001101011’輸出2說明我們可以刪除arr[4]和arr[6],將所有零放在1之前。輸入str=‘000111’輸出0說明在給定的字串中,所有零都已放置在1之前,因此我們不需要從

See all articles