算法思想一:分割+遍历
解题思路:
将两个字符串按点字符分割成块,然后逐个比较这些块
如果两个版本号的块数相同,则可以有效工作。如果不同,则需要在较短字符串末尾补充相应的 .0 块数使得块数相同。
算法:
1、根据点分割两个字符串将分割的结果存储到数组中。
2、遍历较长数组并逐个比较块。如果其中一个数组结束了,实际上可以根据需要添加尽可能多的零,以继续与较长的数组进行比较。
3、如果两个版本号不同,则返回 1 或 -1。
4、版本号相同,返回 0。
代码展示:
Python版本
class Solution: def compare(self , version1 , version2 ): # write code here # 以点为分割点进行分割 nums1 = version1.split('.') nums2 = version2.split('.') n1, n2 = len(nums1), len(nums2) # compare versions # 遍历长度较长的分割数组 for i in range(max(n1, n2)): # 遍历对比 i1 i2,数组遍历完后加0继续 i1 = int(nums1[i]) if i < n1 else 0 i2 = int(nums2[i]) if i < n2 else 0 if i1 != i2: # 如果 i1 i2不同,则进行比较大小判断结果 return 1 if i1 > i2 else -1 # the versions are equal 版本号相同 return 0
复杂度分析
时间复杂度。其中 和 指的是输入字符串的长度。分割字符串时间),遍历分割后的结果时间
空间复杂的:使用了两个数组 和 存储两个字符串的块。
算法思想二:双指针+遍历
解题思路:
使用v1和v2这两个值来分别计算版本号每个被'.'分割的块的版本号的大小,如果不相等,则进行比较
算法流程:
1、初始化双指针v1,v2分别为0
2、分别对两个版本字符串进行遍历
1、遍历第一个版本字符串(索引 i),以 ‘.’ 为分割点(循环结束条件),计算每一块的版本号大小,记为 V1;
2、遍历第二个版本字符串(索引 j),以 ‘.’ 为分割点(循环结束条件),计算每一块的版本号大小,记为 V2;
3、对比V1, V21、:继续遍历两个版本字符串 ,
2、:直接返回 1
3、:直接返回 -1
图解:
代码展示:
JAVA版本
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 比较版本号 * @param version1 string字符串 * @param version2 string字符串 * @return int整型 */ public int compare (String version1, String version2) { // write code here // 两个字符串的长度 int n = version1.length(), m = version2.length(); // 遍历索引 int i = 0; int j = 0; // 循环条件 while (i < n || j < m) { // 用v1,v2来计算每一个块中版本号的大小 int v1 = 0; int v2 = 0; // 若当前的字符不是分隔符,则计算字符的大小 while (i < n && version1.charAt(i) != '.') { v1 = v1 * 10 + version1.charAt(i) - '0'; i++; } // 同理计算 第二个版本号的字符大小 while (j < m && version2.charAt(j) != '.') { v2 = v2 * 10 + version2.charAt(j) - '0'; j++; } // 判断当前块中的版本号是否一致() if (v1 != v2) { if (v1 > v2) { return 1; } return -1; } // 跳过分隔符 i++; j++; } // 全部比较完了,没有不等的则返回0 return 0; } }
复杂度分析
时间复杂度。其中 和 指的是输入字符串的长度。遍历版本字符串时间
空间复杂的:使用双指针及其他常数级空间变量