二进制之和 + 青训营day 2 go的学习 | 豆包MarsCode AI刷题

59 阅读4分钟

感觉不是难题,当然你不知道BigInterger类就是难题了

下面是用MarsCode解释这段代码的实现:

1. 解决思路:
- 我们需要将两个二进制字符串转换为数字,相加后再转为十进制字符串
- 由于题目要求考虑大数问题,所以使用Java的BigInteger类来处理

2. 代码详解:

public static String solution(String binary1, String binary2) {  
    // 第一个参数是字符串,第二个参数是进制数(这里是2进制)  
    java.math.BigInteger a = new java.math.BigInteger(binary1, 2);  
    java.math.BigInteger b = new java.math.BigInteger(binary2, 2);  
    // 使用 add() 方法进行大数相加,toString() 转换为十进制字符串  
    return a.add(b).toString();  
}  

3. 关键点说明:
BigInteger(String val, int radix)
- 第一个参数是要转换的字符串
- 第二个参数是源字符串的进制,这里是2表示输入的是二进制
add(): BigInteger的加法运算方法
toString(): 默认转换为十进制字符串

4. 举例说明:
以输入 "101", "110" 为例:
- "101"(二进制) = 5(十进制)
- "110"(二进制) = 6(十进制)
- 5 + 6 = 11(十进制)

5. 时间复杂度分析:
- BigInteger的加法操作时间复杂度为O(n),其中n是位数
- 二进制转十进制的时间复杂度也是O(n)
- 因此总的时间复杂度为O(n),满足题目要求的不超过O(n²)

6. 为什么选择BigInteger:
- BigInteger可以处理任意大的整数,没有位数限制
- 提供了方便的进制转换功能
- 有完整的数学运算支持
- 能够准确处理题目中提到的100位二进制数字

这个解决方案简洁高效,充分利用了Java内置的BigInteger类来处理大数运算,避免了手动实现二进制加法的复杂性。

ac代码:

public static String solution(String binary1, String binary2) {
        // 使用 java.math.BigInteger 处理大数
        java.math.BigInteger a = new java.math.BigInteger(binary1, 2);
        java.math.BigInteger b = new java.math.BigInteger(binary2, 2);
        return a.add(b).toString();
    }

以下是本次 Go 语言测试相关内容的学习小节:

03

1. 单元测试
- 概念:对软件中最小可测试单元进行验证的测试方法
- 规则:
- 测试文件以 _test.go 结尾
- 测试函数以 Test 开头
- 测试函数接收 *testing.T 参数
- 优点:
- 保证代码质量
- 便于重构
- 提供示例文档

2. Mock 测试
- 用途:模拟外部依赖,隔离测试环境
- 应用场景:
- 数据库操作
- 网络请求
- 文件操作
- 实现方式:
- 接口模拟
- 依赖注入
- Mock 框架使用

3. 基准测试(Benchmark)
- 目的:测试代码性能
- 特点:
- 函数以 Benchmark 开头
- 接收 *testing.B 参数
- 使用场景:
- 性能优化
- 代码比较
- 负载测试

4. 项目实战要点
- 技术架构:
- Web 框架:Gin
- 分层结构:MVC/分层设计
- 核心功能:
- 文件操作:读取文件
- 数据查询:索引实现
- 测试覆盖:
- 单元测试
- 集成测试
- 性能测试

5. 最佳实践
- 测试驱动开发(TDD)
- 合理的测试粒度
- 完善的测试用例
- 持续集成(CI)支持

6. 注意事项
- 测试代码的可维护性
- 避免测试代码耦合
- 合理使用测试辅助工具
- 保持测试的独立性

04 这节课主要围绕 Go 语言在工程实践中的进阶内容,以下是整理的学习要点:

1. 锁(Lock)机制
- 互斥锁(sync.Mutex)
- Lock() 加锁
- Unlock() 解锁
- 使用场景:并发访问共享资源

- 读写锁(sync.RWMutex)
- RLock() 读锁
- RUnlock() 读解锁
- Lock() 写锁
- Unlock() 写解锁
- 适用场景:读多写少

2. 线程同步(WaitGroup)
- 主要方法
- Add(delta int) 设置等待计数
- Done() 完成一个任务
- Wait() 等待所有任务完成

- 使用场景
- 并发任务协调
- 等待多个 goroutine 完成
- 批量任务处理

3. Go Module
- 依赖管理演进
- GOPATH
- vendor
- Go Modules

- 主要命令
bash      go mod init    # 初始化模块      go mod tidy    # 整理依赖      go mod vendor  # 将依赖复制到vendor目录      go mod verify  # 验证依赖

   - 版本管理
- 语义化版本
- go.mod 文件
- go.sum 文件

4. 工程实践要点
- 并发安全
- 合理使用锁机制
- 避免死锁
- 控制锁粒度

- 性能优化
- 锁的选择
- goroutine 管理
- 资源释放

- 依赖管理
- 版本选择
- 依赖更新
- 冲突解决

5. 最佳实践
- 锁的使用
go      var mu sync.Mutex      func doSomething() {          mu.Lock()          defer mu.Unlock()          // 临界区代码      }      

   - WaitGroup示例
go      var wg sync.WaitGroup      for i := 0; i < 3; i++ {          wg.Add(1)          go func() {              defer wg.Done()              // 并发任务          }()      }      wg.Wait()      

   - Go Module使用
bash      # 创建新模块      go mod init myproject            # 添加依赖      go get github.com/some/package            # 更新依赖      go get -u      

6. 注意事项
- 避免锁重入
- 正确处理panic情况
- 及时清理不用的依赖
- 保持依赖版本的稳定性
- 注意并发安全问题

这些内容是Go语言进阶过程中的重要知识点,掌握好这些内容对于提高代码质量和工程实践能力有很大帮助。在实际开发中,需要根据具体场景选择合适的解决方案。