python3__leecode/0067. 二进制求和

本文介绍了四种不同的方法来解决二进制字符串求和问题,包括将二进制转换为十进制进行计算,使用bin函数,通过位运算以及利用join函数。每种方法都提供了详细的代码实现,并给出了示例输入和输出。


一、刷题内容

原题链接

https://leetcode-cn.com/problems/add-binary/

内容描述

给你两个二进制字符串,返回它们的和(用二进制表示)。

输入为 非空 字符串且只包含数字 1 和 0。

示例 1:

输入: a = “11”, b = “1”
输出: “100”
示例 2:

输入: a = “1010”, b = “1011”
输出: “10101”

提示:

每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 “0” ,就都不含前导零。

二、解题方案

1.方法一

二进制转十进制,计算之后再十进制转二进制存贮的集合中。

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        x,y=0,0
        for i in range(len(a)):
            x=x*2+int(a[i])
        for j in range(len(b)):
            y=y*2+int(b[j])
        z=x+y
        r=[]
        s=0
        while z:
            r.append(z%2)
            z//=2
            #r=[0,0,1]
        for i in range(len(r)-1,-1,-1):
            s=s*10+r[i]
        return str(s)

2.方法二

bin函数

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        a=int(a,2)
        b=int(b,2)
        return bin(a+b)[2:]

3.方法三

位运算

1、把 aa 和 bb 转换成整型数字 xx 和 yy,在接下来的过程中,xx 保存结果,yy 保存进位。
2、当进位不为 00 时
①计算当前 xx 和 yy 的无进位相加结果:answer = x ^ y
②计算当前 xx 和 yy 的进位:carry = (x & y) << 1
③完成本次循环,更新 x = answer,y = carry
3、返回 xx 的二进制形式

class Solution:
    def addBinary(self, a, b) -> 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:]

4.方法四

join函数用法

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        if a=='0' and b=='0':
            return '0'
        x,y=0,0
        for i in range(len(a)):
            x=x*2+int(a[i])
        for j in range(len(b)):
            y=y*2+int(b[j])
        z=x+y
        r=[]
        while z:
            r.append(str(z%2))
            z//=2
        return ''.join(r[::-1])
Python 脚本编译为二进制文件后,执行时出现 `Failed to load Python shared library libpython3.9.so.1.0` 或 `libc.so.6: GLIBC_2.28 not found` 等错误,通常是由于目标系统上的 GNU C Library (glibc) 版本低于编译时所依赖的版本所致。 ### 原因分析 在将 Python 脚本打包为二进制文件(如使用 PyInstaller、Nuitka 或 cx_Freeze 等工具)时,生成的可执行文件通常会链接到构建环境中的 glibc 和 Python 动态库。如果目标系统上的 glibc 版本较低,而构建环境使用了较新的 glibc 特性,则运行时会因为缺少所需的 glibc 符号(如 `GLIBC_2.28`)而失败[^1]。 ### 解决方案 #### 1. 使用静态链接的 Python 构建环境 可以选择使用静态链接 glibc 的方式构建 Python 二进制文件,这样可以避免对目标系统 glibc 版本的依赖。但需要注意,glibc 本身不推荐静态链接,可能会导致许可证和兼容性问题。 #### 2. 使用兼容性更强的构建环境 在较旧的 Linux 发行版(如 CentOS 7 或 Ubuntu 16.04)中进行编译,这些系统的 glibc 版本较低(如 glibc 2.17 或 2.23),可以提高在其他系统上的兼容性。例如: ```bash # 使用 Docker 容器构建 docker run -v $(pwd):/src -w /src --rm -it centos:7 python3 setup.py build ``` #### 3. 使用 PyInstaller 的虚拟环境隔离 确保 PyInstaller 使用的是与目标系统兼容的 Python 解释器和库版本。可以通过在兼容性环境中创建虚拟环境来打包: ```bash python3.9 -m venv /path/to/venv source /path/to/venv/bin/activate pip install pyinstaller pyinstaller --onefile your_script.py ``` #### 4. 手动绑定 glibc 库 可以在构建环境中将所需的 glibc 库打包进二进制文件所在目录,并通过 `LD_LIBRARY_PATH` 或 `patchelf` 工具修改二进制文件的库搜索路径: ```bash patchelf --set-rpath &#39;$ORIGIN/lib&#39; your_binary ``` 然后将 `libpython3.9.so.1.0` 和兼容的 `libc.so.6` 放入 `lib/` 目录中。 #### 5. 使用 musl-gcc 替代 glibc 对于极致的兼容性,可以使用 [musl-gcc](https://musl.libc.org/) 编译 Python 或使用 [PyInstaller-musl](https://github.com/yyuu/pyinstaller-musl) 插件,它不依赖 glibc,适用于静态链接和跨平台部署。 ### 注意事项 - 确保构建环境与目标系统的 CPU 架构一致(如 x86_64)。 - 避免使用系统 Python,优先使用虚拟环境或自定义构建的 Python。 - 使用 `strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_` 可以查看当前系统支持的 glibc 版本。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百里 Jess

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值