题目
给你两个版本号 version1 和 version2 ,请你比较它们。
版本号由一个或多个修订号组成,各修订号由一个 '.' 连接。每个修订号由 多位数字 组成,可能包含 前导零 。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0 ,下一个修订号下标为 1 ,以此类推。例如,2.5.33 和 0.1 都是有效的版本号。
比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较 忽略任何前导零后的整数值 。也就是说,修订号 1 和修订号 001 相等 。如果版本号没有指定某个下标处的修订号,则该修订号视为 0 。例如,版本 1.0 小于版本 1.1 ,因为它们下标为 0 的修订号相同,而下标为 1 的修订号分别为 0 和 1 ,0 < 1 。
返回规则如下:
如果 version1 > version2 返回 1,
如果 version1 < version2 返回 -1,
除此之外返回 0。
示例
示例1
输入:version1 = "1.01", version2 = "1.001"
输出:0
解释:忽略前导零,"01" 和 "001" 都表示相同的整数 "1"
示例2
输入:version1 = "1.0", version2 = "1.0.0"
输出:0
解释:version1 没有指定下标为 2 的修订号,即视为 "0"
示例3
输入:version1 = "0.1", version2 = "1.1"
输出:-1
解释:version1 中下标为 0 的修订号是 "0",version2 中下标为 0 的修订号是 "1" 。0 < 1,所以 version1 < version2
解法一:拆分比较
说明:这份解法是我自己的想法,比较麻烦,一开始本来是打算转整数比较的,结果可能写错了转换方法,报错,我就以为是这道题系统不给转整数(【手动狗头】),于是就开启了这个麻烦的做法。
思路
对于每个版本号,先把修订号给截取出来,然后把它们加工成相同的长度,不够长度的左补零,然后对比每个字符,就可以得出大小,如果修订号的数目不一样多,也是采用补零,只不过这种情况下补全的那个修订号是全零。
代码
class Solution {
public int compareVersion(String version1, String version2) {
version1=version1+".";
version2=version2+".";
int left1=0,right1=0;
int left2=0,right2=0;
while(right2<version2.length()||right1<version1.length()){
while(right1<version1.length()&&version1.charAt(right1)!='.'){
right1++;
}
while(right2<version2.length()&&version2.charAt(right2)!='.'){
right2++;
}
String str1=null,str2=null;
if(right1-left1==0){
str1="";
}else{
str1=version1.substring(left1,right1);
}
if(right2-left2==0){
str2="";
}else{
str2=version2.substring(left2,right2);
}
if(str1.length()>str2.length()){
str2=addzero(str2,str1.length());
}else{
str1=addzero(str1,str2.length());
}
int res=compare(str1,str2);
if(res==1||res==-1){
return res;
}
if(right1+1==version1.length()){
left1=++right1;
}else{
left1=(right1++)+1;
}
if(right2+1==version2.length()){
left2=++right2;
}else{
left2=(right2++)+1;
}
}
return 0;
}
public String addzero(String str,int len){
while(str.length()<len){
str='0'+str;
}
return str;
}
public int compare(String str1,String str2){
int index=0;
while(index<str1.length()){
if(str1.charAt(index)>str2.charAt(index)){
return 1;
}
if(str1.charAt(index)==str2.charAt(index)){
index++;
continue;
}
if(str1.charAt(index)<str2.charAt(index)){
return -1;
}
}
return 0;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/f416351518197394a83d3fc4385e06af.png)
这个代码写的很差,因为很多点可以优化,对于截取的操作,没想到用spilt(再次狗头)。进行一些优化后的代码:
class Solution {
public int compareVersion(String version1, String version2) {
version1=version1+".";
version2=version2+".";
int left1=0,right1=0;
int left2=0,right2=0;
while(right2<version2.length()||right1<version1.length()){
while(right1<version1.length()&&version1.charAt(right1)!='.'){
right1++;
}
while(right2<version2.length()&&version2.charAt(right2)!='.'){
right2++;
}
String str1="0",str2="0";
if(right1-left1!=0){
str1=version1.substring(left1,right1);
}
if(right2-left2!=0){
str2=version2.substring(left2,right2);
}
if(Integer.parseInt(str1)>Integer.parseInt(str2)){
return 1;
}else{
if(Integer.parseInt(str1)<Integer.parseInt(str2)){
return -1;
}
}
if(right1+1==version1.length()){
left1=++right1;
}else{
left1=(right1++)+1;
}
if(right2+1==version2.length()){
left2=++right2;
}else{
left2=(right2++)+1;
}
}
return 0;
}
}
解法二:转换成整型比较
思路
先用spilt切割,然后将切割出来的元素转换为整型去比较,省事很多。具体做法是:
先把两个版本号的修订号切割完放在一个字符串数组v1[ ],v2[ ]中
开始比较两个数组中的元素(用index来标志比较到了哪个位置):
如果index小于两个数组的长度,要是v1[index]>v2[index],返回1,=返回0,<返回-1.
如果index已经大于其中的一个数组了,这时候如果是v1[ ]比较长,那么只要其元素有一个大于0,就返回1,如果是v2[ ]比较长,那么只要其元素有一个大于0,就返回-1,否则返回0.
分割方法
String[] v1=version1.split("\\.");//.前要加\\
数字字符串转换整型方法
Integer.parseInt(str);
代码
class Solution {
public int compareVersion(String version1, String version2) {
String[] v1=version1.split("\\.");
String[] v2=version2.split("\\.");
int index=0;
while(index<v1.length&&index<v2.length){
if(Integer.parseInt(v1[index])>Integer.parseInt(v2[index])){
return 1;
}else{
if(Integer.parseInt(v1[index])<Integer.parseInt(v2[index])){
return -1;
}else{
index++;
}
}
}
while(index<v1.length){
if(Integer.parseInt(v1[index++])>0){
return 1;
}
}
while(index<v2.length){
if(Integer.parseInt(v2[index++])>0){
return -1;
}
}
return 0;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/151dae9e942fe9b188974b270ccc5c72.png)
代码确实比第一个简洁很多,但是由于第一个方法不需要储存分割后的元素,所以空间复杂度还略显优秀一些。