165. Compare Version Numbers

本文介绍了一种使用递归方法来比较两个软件版本号大小的算法实现。通过查找每个版本号中的点分隔符来逐段比较数字部分,最终确定两个版本的大小关系。

可能字符串中没有‘.',或者有多个‘.',所以用递归的方法更加好

class Solution {
public:
    int compareVersion(string version1, string version2) {
        if(version1 == version2)
            return 0;
            
        int pos1 = version1.find_first_of('.');
        int pos2 = version2.find_first_of('.');
        
        pos1 = pos1 == string::npos?version1.size():pos1;
        pos2 = pos2 == string::npos?version2.size():pos2;
        
        int l1 = atoi(version1.substr(0,pos1).c_str());
        int l2 = atoi(version2.substr(0,pos2).c_str());
        
        pos1 = pos1 == version1.size()?pos1:++pos1;
        pos2 = pos2 == version2.size()?pos2:++pos2;
        if(l1 != l2)
            return l1 > l2?1:-1;
        return compareVersion(version1.substr(pos1),version2.substr(pos2));
    }
};



### 代码分析 由于没有给出 `AbsoluteMin` 类的具体代码,下面先给出一个可能的实现: ```java import java.util.Arrays; import java.util.List; public class AbsoluteMin { public static double findAbsoluteMin(List<Double> numbers) { if (numbers == null || numbers.isEmpty()) { throw new IllegalArgumentException("Input list cannot be null or empty"); } double minAbs = Math.abs(numbers.get(0)); double result = numbers.get(0); for (double num : numbers) { double absNum = Math.abs(num); if (absNum < minAbs) { minAbs = absNum; result = num; } } return result; } public static void main(String[] args) { List<Double> numbers = Arrays.asList(-3.0, 1.0, -0.5, 2.0); System.out.println(findAbsoluteMin(numbers)); } } ``` 这段代码的功能是在给定的 `List<Double>` 中找到绝对值最小的元素。首先检查输入列表是否为空或 `null`,若为空则抛出异常。然后初始化最小绝对值和结果为列表的第一个元素,遍历列表,比较每个元素的绝对值,若小于当前最小绝对值,则更新最小绝对值和结果。 ### 代码优化 上述代码已经比较简洁,但可以考虑使用 Java 8 的 Stream API 进行优化,使代码更具函数式风格: ```java import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.Optional; public class AbsoluteMin { public static Optional<Double> findAbsoluteMin(List<Double> numbers) { if (numbers == null || numbers.isEmpty()) { return Optional.empty(); } return numbers.stream() .min(Comparator.comparingDouble(Math::abs)); } public static void main(String[] args) { List<Double> numbers = Arrays.asList(-3.0, 1.0, -0.5, 2.0); findAbsoluteMin(numbers).ifPresent(System.out::println); } } ``` 使用 Stream API 的 `min` 方法和 `Comparator.comparingDouble` 方法,代码更加简洁易读。同时,使用 `Optional` 来处理可能为空的列表,避免了抛出异常。 ### 单元测试 使用 JUnit 5 进行单元测试: ```java import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.List; import java.util.Optional; import static org.junit.jupiter.api.Assertions.assertEquals; public class AbsoluteMinTest { @Test public void testFindAbsoluteMin() { List<Double> numbers = Arrays.asList(-3.0, 1.0, -0.5, 2.0); Optional<Double> result = AbsoluteMin.findAbsoluteMin(numbers); assertEquals(-0.5, result.get()); } @Test public void testFindAbsoluteMinEmptyList() { List<Double> numbers = Arrays.asList(); Optional<Double> result = AbsoluteMin.findAbsoluteMin(numbers); assertEquals(Optional.empty(), result); } } ``` 测试用例覆盖了正常情况和空列表的情况。 ### 变异测试 变异测试是通过对代码进行微小的修改(即变异),然后运行测试用例,看测试用例是否能检测到这些变异。可以使用 PITest 工具进行变异测试。 1. **添加依赖**:在 `pom.xml` 中添加 PITest 插件: ```xml <build> <plugins> <plugin> <groupId>org.pitest</groupId> <artifactId>pitest-maven</artifactId> <version>1.9.2</version> <configuration> <targetClasses> <param>com.example.*</param> </targetClasses> <targetTests> <param>com.example.*Test</param> </targetTests> </configuration> </plugin> </plugins> </build> ``` 2. **运行变异测试**:在命令行中运行 `mvn org.pitest:pitest-maven:mutationCoverage`。 3. **分析结果**:PITest 会生成一个 HTML 报告,显示哪些变异被杀死,哪些变异存活。根据报告可以进一步优化测试用例。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值