四时宝库

程序员的知识宝库

位运算:golang实现二进制求和的算法

题目介绍:
给你两个二进制字符串 ab ,以二进制字符串的形式返回它们的和。

示例 1:

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

示例 2:

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

解题关键:
1, 位相加,处理进位
3, 将二进制字符串倒序
2, 最后重新翻转数字得到结果
这里讲下golang里的字符串转化成数字的技巧:'1' - '0', 注意看是单引号,不是双引号,以上表达式得到的是数字类型,对应uint32类型

如下是完整代码

package binarys

import (
    "fmt"
    "strings"
    "testing"
)

// addBinary 函数接受两个二进制字符串,返回它们的和(也是二进制字符串)
func addBinary(a string, b string) string {
    // 将字符串反转,便于从低位开始相加
    a = reverseString(a)
    b = reverseString(b)

    // 初始化结果字符串和进位
    var result strings.Builder
    carry := 0

    // 遍历两个字符串的每一位
    i, j := 0, 0
    for i < len(a) || j < len(b) || carry > 0 {
       // 获取当前位的值,如果索引超出字符串长度,则默认为 0
       digitA := 0
       if i < len(a) {
          digitA = int(a[i] - '0')
          i++
       }

       digitB := 0
       if j < len(b) {
          digitB = int(b[j] - '0')
          j++
       }

       // 计算当前位的和以及进位
       sum := digitA + digitB + carry
       result.WriteByte(byte(sum%2 + '0'))
       carry = sum / 2
    }

    // 反转结果字符串并转换为字符串类型返回
    return reverseString(result.String())
}

// reverseString 函数反转字符串
func reverseString(s string) string {
    runes := []rune(s)
    i, j := 0, len(runes)-1
    for i < j {
       runes[i], runes[j] = runes[j], runes[i]
       i++
       j--
    }
    return string(runes)
}

func TestBinarySum(t *testing.T) {
    a := "11"
    b := "1"
    fmt.Println(addBinary(a, b)) // 输出: "100"

    a = "1010"
    b = "1011"
    fmt.Println(addBinary(a, b)) // 输出: "10101"
}

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接