牛客网面试必刷:BM22 比较版本号
- 前言
- 一、解法1:分割截取
前言
牛客项目发布项目版本时会有版本号,比如1.02.11,2.14.4等等
现在给你2个版本号version1和version2,请你比较他们的大小
版本号是由修订号组成,修订号与修订号之间由一个"."连接。1个修订号可能有多位数字组成,修订号可能包含前导0,且是合法的。例如,1.02.11,0.1,0.2都是合法的版本号
每个版本号至少包含1个修订号。
修订号从左到右编号,下标从0开始,最左边的修订号下标为0,下一个修订号下标为1,以此类推。
比较规则:
一. 比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较忽略任何前导零后的整数值。比如"0.1"和"0.01"的版本号是相等的
二. 如果版本号没有指定某个下标处的修订号,则该修订号视为0。例如,“1.1"的版本号小于"1.1.1”。因为"1.1"的版本号相当于"1.1.0",第3位修订号的下标为0,小于1
三. version1 > version2 返回1,如果 version1 < version2 返回-1,不然返回0.
一、解法1:分割截取
既然方法一都是每次以点为界限,将字符转换为数字,那我们是不是可以尝试提前就把它们分割好呢?分割也不难,可以借助Java或者Pyhton的split函数直接按照点为间隔划分开。C++没有这么方便的split函数了,但是我们还有流输入istringstream,只需要用一个字符型变量承接点,其他部分就是逐渐输入数组中
-
具体做法:
- step 1:使用split函数或者字符串流输入,按照点将两个原始字符串分割,使每个修订号的数字单独呈现在数组中。
- step 2:遍历数组,每次各自取出一个数字比较,较短的版本号没有可取的数字了,就直接取0
- step 3:遍历取出的数字字符串,将其转换成数字,然后比较数字大小。根据大小关系返回1或者-1,如果全部比较完都无法比较出大小关系,则返回0.
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 比较版本号
* @param version1 string字符串
* @param version2 string字符串
* @return int整型
*/
public int compare (String version1, String version2) {
// write code here
String[] v1 = version1.split("\\.");
String[] v2 = version2.split("\\.");
int length = v1.length > v2.length? v2.length : v1.length;
int flag = 0;
int i = 0;
for(i = 0;i <= length - 1;i++){
int v11 = Integer.valueOf(v1[i]);
int v22 = Integer.valueOf(v2[i]);
if(v11 < v22) {
flag = -1;
break;
}else if(v11 > v22){
flag = 1;
break;
}else{
continue;
}
}
//如果v1长度更长,则比较v1后面的数字,有大于0的则v1大
if(flag == 0 && v1.length - i > 0){
while(i <= v1.length - 1){
if(Integer.valueOf(v1[i]) > 0){
flag = 1;
break;
}
i++;
}
}else if(flag == 0 && v2.length - i > 0){
while(i <= v2.length - 1){
if(Integer.valueOf(v2[i]) > 0){
flag = -1;
break;
}
i++;
}
}
return flag;
}
}