字节SRE面试算法题

字节SRE面试:两个大数相加算法

两个大数相加。
1、是整数;
2、两个数无限大,long都装不下;
3、不能用BigInteger;
4、不能用任何包装类提供的运算方法;
5、两个数都是以字符串的方式提供。
例:
str1 = “123”,str2 = “456123”
输出:“456246”
解法一:通过对每个字符转换相加得到结果,单字符转换不会超过大整型,需要处理进位问题。

def s(str1: str, str2: str) -> str:  
    # 如果任一字符串为空,则返回另一个字符串  
    if str1 == '':  
        return str2  
    elif str2 == '':  
        return str1  
      
    # 获取两个字符串的长度  
    lenth1 = len(str1)  
    lenth2 = len(str2)  
      
    # 初始化一个空列表来存储结果字符  
    lst1 = []  
      
    # 初始化进位  
    increase = 0  
      
    # 确定哪个字符串更短,哪个更长,以及它们的长度  
    if lenth1 < lenth2:  
        less = str1  # 较短的字符串  
        more = str2  # 较长的字符串  
        more_lenth = lenth2  # 较长字符串的长度  
        lenth = lenth1  # 用于遍历较短字符串的长度  
    else:  
        less = str2  
        more = str1  
        more_lenth = lenth1  
        lenth = lenth2  
      
    # 将较长字符串的每个字符添加到结果列表中  
    for i in more:  
        lst1.append(i)  
      
    for i in less[lenth-1::-1]:  
        # 获取结果列表的最后一个字符(实际上是较长字符串的当前对应字符)  
        # 和较短字符串的当前字符,将它们转换为整数并相加,再加上进位  
        num = int(lst1[more_lenth-1]) + int(i) + increase  
          
        # 计算当前位的值(取模10)  
        num %= 10  
          
        # 更新结果列表的最后一个字符  
        lst1[more_lenth-1] = str(num)  # 这里需要转换为字符串,因为lst1是字符列表  
          
        # 更新进位  
        increase = num // 10  
          
        # 减少较长字符串的对应索引,以便在下一次迭代中处理下一个字符  
        more_lenth -= 1  
  
    result = ''.join(lst1)  # 将字符列表转换为字符串  
      
    # 如果在最长字符串处理完毕后还有进位,需要将其添加到结果字符串的开头  
    # 但由于我们的列表是从较长字符串开始的,并且我们是在逆序处理较短字符串,  
    # 所以如果最后有进位,它已经在lst1的第一个位置了(因为我们是从后往前填充的)  
    # 因此,我们不需要额外的步骤来处理这个进位,它已经被正确地包含在了result中  
      
    # 返回最终的结果字符串  
    return result  
  
# 测试代码  
str1 = "123"  
str2 = "123456"  
x = s(str1, str2)  
print(x)  # 输出应该是 "123579"
print(type(x))  # 输出应该是 <class 'str'>

解法二:通过字符asscll码加减,需要处理进位问题

def add(str1, str2):  
    # 任何一个字符串为None或空字符串,都不需要相加了  
    if str1 is None or str1 == "":  
        return str2  
    if str2 is None or str2 == "":  
        return str1  
      
    max_length = max(len(str1), len(str2))  
    # 定义一个存贮结果的字符串,长度要比最大长度字符串还长一位,用于存储可能出现的进位  
    result = []  
      
    # 翻转两个字符串  
    str1 = str1[::-1]  
    str2 = str2[::-1]  
      
    # 反转后的结果分别为:  
    # 954321  
    # 321  
    min_length = min(len(str1), len(str2))  
    # 进位  
    carry = 0  
    # 当前位上的数值  
    current_num = 0  
    # 循环变量  
    i = 0  
      
    for i in range(min_length):  
        # 分别获取两个字符对应的字面数值,然后相加,再加上进位  
        current_num = int(str1[i]) + int(str2[i]) + carry  
        # 获取进位  
        carry = current_num // 10  
        # 处理当前位的最终值  
        current_num = current_num % 10  
        # 保存当前位的值到最终的列表中  
        result.append(str(current_num))  
      
    if len(str1) < len(str2):  
        # 选择较长的字符串继续处理  
        str1 = str2  
      
    for i in range(min_length, len(str1)):  
        # 分别获取字符对应的字面数值,然后相加,再加上进位  
        current_num = int(str1[i]) + carry  
        # 获取进位  
        carry = current_num // 10  
        # 处理当前位的最终值  
        current_num = current_num % 10  
        # 保存当前位的值到最终的列表中  
        result.append(str(current_num))  
      
    # 处理最后一个的进位(当循环结束后,是不是还可能会有一个进位)  
    if carry > 0:  
        result.append(str(carry))  
      
    # 最后翻转恢复字符串,再返回  
    return ''.join(result[::-1])  
  
# 测试代码  
str1 = "123459"  
str2 = "123"  
print(add(str1, str2))  # 输出: 123582
### 字节跳动 AML 团队 SRE 岗位面试经验分享 字节跳动的 SRE(Site Reliability Engineering)岗位通常要求候选人具备扎实的技术基础和丰富的实践经验。以下是一些可能涉及的面试内容及准备建议。 #### 技术基础知识 SRE 岗位的核心是保障系统的高可用性、性能优化以及故障处理能力。常见的技术知识点包括但不限于操作系统、网络协议、分布式系统设计等[^1]。 - **操作系统**:深入理解进程管理、内存管理、文件系统等关键概念,熟悉 Linux 系统调用机制与性能分析工具。 - **计算机网络**:掌握 TCP/IP 协议栈的工作原理,了解 HTTP/HTTPS 的具体实现细节,能够排查常见的网络问题。 - **分布式系统**:对一致性算法(如 Paxos、Raft)、负载均衡策略、缓存机制有深刻认识,并能结合实际场景进行应用。 #### 编程能力 编程能力是评估候选人逻辑思维与解决问题的重要指标。通常会考察 Python 或 Go 语言的使用熟练度,因为这两种语言在 SRE 领域较为流行[^2]。 ```python # 示例代码:实现一个简单的 HTTP 请求函数 import requests def fetch_url(url): try: response = requests.get(url, timeout=5) response.raise_for_status() return response.text except requests.exceptions.RequestException as e: print(f"Error fetching {url}: {e}") return None ``` #### 故障排查与应急响应 面试中可能会模拟真实环境下的故障场景,要求候选人快速定位问题并提出解决方案。例如数据库连接池耗尽、API 超时等问题[^3]。 - **日志分析**:熟悉 ELK Stack 或其他日志管理系统,能够通过日志快速找到异常点。 - **监控告警**:了解 Prometheus、Grafana 等开源监控工具的配置与使用方法,设计合理的告警规则。 #### 项目经验与案例 准备过程中可以整理过往参与过的运维项目,重点突出以下几个方面: - 如何提升服务的可用性与稳定性; - 成功解决过的复杂生产环境问题及其改进措施; - 自动化脚本或平台开发经历,展示如何减少人工干预提高效率。 #### 软技能 除了硬实力之外,良好的沟通能力和团队协作精神也是不可或缺的素质。在跨部门合作时,清晰表达自己的观点同时倾听他人意见尤为重要[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值