Algorithmus leetcode|67. Binäre Summierung (Rost schlägt hart)



67. Binäre Summation:

Wenn Sie zwei Binärzeichenfolgen a und b haben, geben Sie deren Summe als Binärzeichenfolge zurück.

Beispiel 1:

输入:

	a = "11", b = "1"
	
输出:

	"100"

Beispiel 2:

输入:
	
	a = "1010", b = "1011"
	
输出:
	
	"10101"

Hinweis:

  • 1 <= a.Länge, b.Länge <= 10 4
  • aund bestehen bnur aus den Zeichen '0'bzw'1'
  • "0"Andernfalls enthält die Zeichenfolge keine führenden Nullen

analysieren:

  • Angesichts dieses Algorithmusproblems geriet der zweite Leiter erneut in tiefe Gedanken.
  • Verwenden Sie die API direkt, um Zeichenfolgen entsprechend dem Binärsystem in Ganzzahlen umzuwandeln, fügen Sie sie hinzu, konvertieren Sie sie dann gemäß dem Binärsystem in Zeichenfolgen und beenden Sie die Arbeit. Diese Methode kann jedoch zu einem Ganzzahlüberlauf führen.
  • Verarbeiten Sie die Zeichen einzeln entsprechend der Art und Weise der Zeichen und simulieren Sie unsere manuelle Berechnungsmethode, eine nach der anderen Berechnung, volle zwei in eins, und der Rest ist die aktuelle Ziffer. Diese Methode hat relativ viel Code, wird es aber tun den Kunststoff nicht überlaufen lassen. Es ist zu beachten, dass nach dem Durchlaufen der beiden Ziffern der letzte mögliche Übertrag hinzugefügt werden muss. Da die Berechnung bitweise ab dem letzten Bit berechnet wird und das Ergebnis eine Zeichenfolge ist, steht das Ergebnis der Addition des letzten Bits in diesem Fall am Anfang, wenn wir das Ergebnis jedes Mal hinter uns lassen, was umgekehrt ist . Am Ende muss also die Ergebniszeichenfolge umgekehrt werden. Natürlich kann das Ergebnis der bitweisen Addition auch jedes Mal am Anfang der Zeichenfolge platziert werden, sodass das Ergebnis am Ende nicht umgekehrt werden muss.
  • Darüber hinaus können auch Bitoperationen verwendet werden. Nur wenn eines der beiden Binärbits ist und '0'das andere ist , wird das ursprüngliche Bit sein , sodass der Wert des ursprünglichen Bits durch Verwendung der Bit-XOR-Operation erhalten werden kann. Und nur wenn die beiden Ziffern beide sind, wird der Übertrag ausgeführt, sodass Sie das Bit und die Operation verwenden können, um den Wert des Übertrags ohne endlosen Übertrag zu erhalten, und schließlich das Ergebnis erhalten, sodass Sie den Wert berechnen können Phase zweier Zahlen ohne Addition. Ergebnisse hinzugefügt.'1''1''1'

Antwort:

Rost:

impl Solution {
    
    
    pub fn add_binary(a: String, b: String) -> String {
    
    
		let mut ans = String::new();

        let mut carry = 0;

        (0..a.len().max(b.len())).for_each(|i| {
    
    
            if i < a.len() && a.as_bytes()[a.len() - 1 - i] == b'1' {
    
    
                carry += 1;
            }
            if i < b.len() && b.as_bytes()[b.len() - 1 - i] == b'1' {
    
    
                carry += 1;
            }
            if carry == 1 || carry == 3 {
    
    
                ans.push('1');
            } else {
    
    
                ans.push('0');
            }
            carry /= 2;
        });

        if carry > 0 {
    
    
            ans.push('1');
        }

        return ans.chars().rev().collect();
    }
}

gehen:

func addBinary(a string, b string) string {
    
    
	ans := ""
	carry := 0
	lenA, lenB := len(a), len(b)
	n := lenA
	if lenB > lenA {
    
    
		n = lenB
	}

	for i := 0; i < n; i++ {
    
    
		if i < lenA {
    
    
			carry += int(a[lenA-i-1] - '0')
		}
		if i < lenB {
    
    
			carry += int(b[lenB-i-1] - '0')
		}
		ans = strconv.Itoa(carry%2) + ans
		carry /= 2
	}
	if carry > 0 {
    
    
		ans = "1" + ans
	}

	return ans
}

c++:

class Solution {
    
    
public:
    string addBinary(string a, string b) {
    
    
		string ans;
        reverse(a.begin(), a.end());
        reverse(b.begin(), b.end());

        int n = max(a.size(), b.size()), carry = 0;
        for (size_t i = 0; i < n; ++i) {
    
    
            carry += i < a.size() ? (a.at(i) == '1') : 0;
            carry += i < b.size() ? (b.at(i) == '1') : 0;
            ans.push_back((carry % 2) ? '1' : '0');
            carry /= 2;
        }

        if (carry) {
    
    
            ans.push_back('1');
        }
        reverse(ans.begin(), ans.end());

        return ans;
    }
};

Python:

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        x, y = int(a, 2), int(b, 2)
        while y:
            answer = x ^ y
            carry = (x & y) << 1
            x, y = answer, carry
        return bin(x)[2:]


Java:

class Solution {
    
    
    public String addBinary(String a, String b) {
    
    
		StringBuilder ans = new StringBuilder();

        int n = Math.max(a.length(), b.length()), carry = 0;
        for (int i = 0; i < n; ++i) {
    
    
            carry += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0;
            carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0;
            ans.append((char) (carry % 2 + '0'));
            carry /= 2;
        }
        if (carry > 0) {
    
    
            ans.append('1');
        }
        ans.reverse();

        return ans.toString();
    }
}

Vielen Dank, dass Sie diesen Artikel gelesen haben ~
Willkommen bei [Gefällt mir] [Favorit] [Kommentar] Gehen Sie dreimal hintereinander ~ Es ist
nicht schwer aufzugeben, aber es muss cool sein ~
Ich hoffe, wir können uns alle jeden Tag ein wenig verbessern ~
Dieser Artikel wurde vom White Hat des zweiten Meisters geschrieben: https://le-yi.blog.csdn.net/Blog original~


Guess you like

Origin blog.csdn.net/leyi520/article/details/132110365