题目:

Compare two version numbers version1 and version2.

If version1 > version2 return 1, if version1 < version2 return -1, otherwise return 0.

You may assume that the version strings are non-empty and contain only digits and the
. character.

The . character does not represent a decimal point and is used to separate number sequences.

For instance, 2.5 is not "two and a half" or "half way to version three", it is the fifth second-level revision of the second first-level revision.

Here is an example of version numbers ordering:

0.1 < 1.1 < 1.2 < 13.37

题目属于简单级别,还是挺复杂的,思路:将字符串按照"."分割,将“.”之间的数字转化为整数,然后分别对应比较。例如:1.2和13.37,分别转化为数组[1,2]和[13,37],从前往后对应比较1比13小,这时就可以得出结论1.2<13.37,若相等,则继续向后比较。这里需要注意,若两个字符串转化的数组不等长,需要将短的数组后面补0,例如,1.1和1.1.0,前者转化为[1,1],后者是[1,1,0],这时需要将前者补齐为[1,1,0],然后再对应比较。代码如下:

public int compareVersion(String version1, String version2) {
//.的个数
int dot_num1 = 0;
int dot_num2 = 0;
for(int i = 0;i<version1.length();i++)
{
if(version1.charAt(i)=='.')
dot_num1 ++;
}
for(int i = 0;i<version2.length();i++)
{
if(version2.charAt(i)=='.')
dot_num2 ++;
}
//按照.的位置截取子串
String arr1[] = new String[dot_num1+1];
String arr2[] = new String[dot_num2+1];
//记录每个字符串中的.的个数
int index1[] = new int[dot_num1+2];
int index2[] = new int[dot_num2+2]; int in1 = 1;
index1[0] = -1;
for(int i = 0;i<version1.length();++i)
{
if(version1.charAt(i)=='.')
index1[in1++] = i;
}
index1[in1] = version1.length(); int in2 = 1;
index2[0] = -1;
for(int i = 0;i<version2.length();++i)
{
if(version2.charAt(i)=='.')
index2[in2++] = i;
}
index2[in2] = version2.length(); //截取子串
int index = 0;
for(int i = 0;i<index1.length-1;i++)
{
arr1[index++] = version1.substring(index1[i]+1,index1[i+1]);
} index = 0;
for(int i = 0;i<index2.length-1;i++)
{
arr2[index++] = version2.substring(index2[i]+1,index2[i+1]);
}
int len1 = arr1.length;
int len2 = arr2.length;
int max = len1>len2?len1:len2;
//所有子串转化为整数形式
int num1[] = new int[max];
int num2[] = new int[max];
for(int i = 0;i<len1;i++)
num1[i] = Integer.parseInt(arr1[i]);
for(int i = 0;i<len2;i++)
num2[i] = Integer.parseInt(arr2[i]);
//长度不一,短的后面0补齐
/*
* *
* 例如1.0和1.0.0
* 前者生成的num1数组为[1,0]
* 后者生成的num2数组为[1,0,0]
* 这里将num1补齐为[1,0,0],便于比较
*/
if(len1>=len2)
{
for(int i = len2;i<len1;i++)
{
num2[i] = 0;
}
}
else
{
for(int i = len1;i<len2;i++)
{
num1[i] = 0;
}
}
/*for(int i = 0;i<num2.length;i++)
{
System.out.println(num2[i]);
} for(int i = 0;i<num1.length;i++)
{
System.out.println(num1[i]);
}*/
for(int i = 0;i<max;i++)
{
if(num1[i]>num2[i])
return 1;
if(num1[i]<num2[i])
return -1;
} return 0;
}

最新文章

  1. 分享一个LiteDB做的简单考试系统辅助工具
  2. javaweb回顾第十篇JSTL
  3. js鼠标事件、键盘事件实例代码
  4. MySQL 视图知识点小结
  5. 【网络流24题】 No.10 餐巾计划问题 (线性规划网络优化 最小费用最大流)
  6. Boostrap 模态框 水平垂直居中问题
  7. [置顶] Android开发之ProcessState和IPCThreadState类分析
  8. Jquery autocomplete 插件示例
  9. HTML5开发桌面应用:选择node-webkit还是有道heX
  10. oschina Web应用开发
  11. Android开发之Ubuntu上Eclipse不显示手机设备
  12. Git详细教程(3)---结合gitHub使用
  13. js实现导航菜单栏随着屏幕的滚动进行滚动的效果
  14. 如何连接远程redis,并且选择某个库进行操作
  15. &#39;utf-8&#39; codec can&#39;t decode byte 0xff in position 0: invalid start byte
  16. Spring初始化ApplicationContext为null
  17. IIS7如何实现访问HTTP跳转到HTTPS访问
  18. vue的一些小坑
  19. Nginx之编译安装的nginx加入systemctl
  20. 16.linux常用查看命令

热门文章

  1. spring中事务传播解读:PROPAGATION_REQUIRES_NEW
  2. C语言 &#183; P1001(大数乘法)
  3. openresty package.path require 报错
  4. DP - 字符混编
  5. CSS3 实现的一个简单的&quot;动态主菜单&quot; 示例
  6. ubuntu 按键替换 Control_R to Left
  7. php -- 判断文件是否存在
  8. yii2 输出json的方法
  9. HMLocationEvent
  10. hdu 4722(记忆化搜索)