数组 - 165.比较版本号
比较两个版本号 version1 和 version2。
如果
version1 > version2
返回1
,如果version1 < version2
返回-1
, 除此之外返回0
。你可以假设版本字符串非空,并且只包含数字和
.
字符。
.
字符不代表小数点,而是用于分隔数字序列。例如,
2.5
不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。你可以假设版本号的每一级的默认修订版号为
0
。例如,版本号3.4
的第一级(大版本)和第二级(小版本)修订号分别为3
和4
。其第三级和第四级修订号均为0
。示例 1:
输入: version1 = "0.1", version2 = "1.1" 输出: -1
示例 2:
输入: version1 = "1.0.1", version2 = "1" 输出: 1
示例 3:
输入: version1 = "7.5.2.4", version2 = "7.5.3" 输出: -1
示例 4:
输入:version1 = "1.01", version2 = "1.001" 输出:0 解释:忽略前导零,“01” 和 “001” 表示相同的数字 “1”。
示例 5:
输入:version1 = "1.0", version2 = "1.0.0" 输出:0 解释:version1 没有第三级修订号,这意味着它的第三级修订号默认为 “0”。
提示:
版本字符串由以点 (
.
) 分隔的数字字符串组成。这个数字字符串可能有前导零。
版本字符串不以点开始或结束,并且其中不会有两个连续的点。
一.实现思路
分割点构建数组
- 分割点构建数组
- 遍历最长的那个数组
- 设置一个bigsize和一个smallsize
- 一次遍历,按照顺序比较。时间负责度为
O(n)
- 如果前面都是相等,一直到i大于小的数组的长度,则看大的数组是否为0,不为0则长的那个大
char数组遍历
- 将字符串转换为char数组
- 创建stringbuilder作为存储单个元素(。与。之间的char)
- 然后循环比较
这个比上面那种方法效率高主要是由于string的split方法耗时,用正则进行切割,速度会比较慢
使用byte构建数值比较大小
和上面版本差不多,但是优化为了byte比较
二.代码实现
分割点构建数组
public class Solution {
int bigSize ;
int smallSize;
boolean flag;
public int compareVersion(String version1, String version2) {
String[] version1List = version1.split("\\.");
String[] version2List = version2.split("\\.");
bigSize =version2List.length ;
smallSize=version1List.length;
if (bigSize<smallSize){
int t = bigSize;
bigSize = smallSize;
smallSize = t;
flag=true;
}
for (int i = 0; i < bigSize; i++) {
if (i>=smallSize){
if (!flag&&Integer.parseInt(version2List[i])>0){
return -1;
} else if (flag&&Integer.parseInt(version1List[i])>0){
return 1;
}
continue;
}
if (Integer.parseInt(version1List[i])==Integer.parseInt(version2List[i])) {
continue;
}else if (Integer.parseInt(version1List[i])>Integer.parseInt(version2List[i])) {
return 1;
}else {
return -1;
}
}
return 0;
}
}
char数组遍历
public class Solution {
public int compareVersion(String version1, String version2) {
char[] bArr1 = version1.toCharArray();
char[] bArr2 = version2.toCharArray();
int index1 = 0;
int index2 = 0;
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
while (index1 < bArr1.length || index2 < bArr2.length) {
for (int i = index1; i < bArr1.length; i++) {
if (bArr1[i] == '.') {
index1 = ++i;
break;
}
sb1.append(bArr1[i]);
index1 = i +1;
}
for (int j = index2; j < bArr2.length; j++) {
if (bArr2[j] == '.') {
index2 = ++j;
break;
}
sb2.append(bArr2[j]);
index2 = j+1;
}
Integer b1 = sb1.length()==0?0:Integer.parseInt(sb1.toString());
Integer b2 = sb2.length()==0?0:Integer.parseInt(sb2.toString());
if (b1 > b2) {
return 1;
}
if (b1 < b2) {
return -1;
}
sb1.setLength(0);
sb2.setLength(0);
}
return 0;
}
}
使用byte构建数值比较大小
public int compareVersion(String version1, String version2) {
//取值游标位置索引
int index1 = 0;
int index2 = 0;
while (index1 < version1.length() || index2 < version2.length()) {
int b1 = 0;
for (int i = index1; i < version1.length(); i++) {
// 46 为 .的byte值
if (version1.charAt(i) == 46) {
index1 = ++i;
break;
}
// 48 为 0的byte值: 减去48为了使值小于10(前面乘10就可以了)
b1 = b1 * 10 + (version1.charAt(i) - 48);
index1 = i + 1;
}
int b2 = 0;
for (int j = index2; j < version2.length(); j++) {
if (version2.charAt(j) == 46) {
index2 = ++j;
break;
}
b2 = b2 * 10 + (version2.charAt(j) - 48);
index2 = j + 1;
}
if (b1 > b2) {
return 1;
}
if (b1 < b2) {
return -1;
}
}
return 0;
}