我们先从一个 代码 开始:
这是一道比较 版本号大小的编程题,leetcode 第 165 题,版本号的格式为
版本格式:主版本号.次版本号.修订号。
比较两个版本号 version1 和 version2。
如果 version1 > version2 返回 1,如果 version1 < version2 返回 -1, 除此之外返回 0。
你可以假设版本字符串非空,并且只包含数字和 . 字符。
. 字符不代表小数点,而是用于分隔数字序列。
代码:看不懂循环,所以 用断点调试一步一步看运行结果,终于弄懂了!IDEA 中 用F9 继续执行,进入下一个断点。
package com.douyu;
/*
* 斗鱼直播面试:版本号比较大小
*/
public class versionCompare {
public int compareversion(String version1, String version2){
String[] nums1 = version1.split("\\.");
String[] nums2 = version2.split("\\.");
int n1 = nums1.length, n2 = nums2.length;
// compare versions
int i1, i2;
for (int i = 0; i < Math.max(n1, n2); ++i) { //使用版本号最长的来进行遍历
i1 = i < n1 ? Integer.parseInt(nums1[i]) : 0; // 遍历完版本号了吗? 没有,
// 将 版本号中的元素转换了int 给 i1 来比较大小/ 没有元素了则添加为0进行比较
i2 = i < n2 ? Integer.parseInt(nums2[i]) : 0;
if (i1 != i2) {
return i1 > i2 ? 1 : -1;
}
}
// the versions are equal
return 0;
}
public static void main(String[] args){
String version1 = "1.";
String version2 = "1.04";
versionCompare cp = new versionCompare();
int result = cp.compareversion(version1,version2);
System.out.println(result);
}
}
解题思路:官方版本
分割+解析,两次遍历,线性空间。
第一个想法是将两个字符串按点字符分割成块,然后逐个比较这些块。
如果两个版本号的块数相同,则可以有效工作。如果不同,则需要在较短字符串末尾补充相应的.0块数使得块数相同。
算法:
(1)根据点分割两个字符串将分割的结果存储到数组中。
(2)遍历较长数组并逐个比较块。如果其中一个数组结束了,实际上可以根据需要添加尽可能多的零,以继续与较长的数组进行比较。
A. 如果两个版本号不同,则返回 1 或 -1。
(3)版本号相同,返回 0。
这里是讲字符串的使用的,进入正题:
首先,String 类型的字符串是不可以改变的,那么我如何进行取出一个个版本号比较大小呢?
答案是:把 String 类型的字符串变成 字符串数组。
方法:
char[] ss=s.toCharArray();//s为要转化的字符串
String[] arr = str.split(","); // 用,分割
注意: . 、 | 和 * 等转义字符,必须得加 \\。多个分隔符,可以用 | 作为连字符。
比如我们代码中的 String[] nums1 = version1.split("\\."); 就是这个意思!
关于字符窜 String 本身,常见的一些方法:
length() 方法,它返回字符串对象包含的字符数
使用'+'操作符来连接字符串
charAt(index),返回指定索引处的 char 值。
compareToIgnoreCase() 方法用于按字典顺序比较两个字符串,不考虑大小写
补充:返回值是整数,如果参数字符串等于此字符串,则返回值 0;如果此字符串小于字符串参数,则返回一个小于 0 的值;如果此字符串大于字符串参数,则返回一个大于 0 的值。
equals() 方法用于将字符串与指定的对象比较:Str1.equals( Str2 )
split() 方法根据匹配给定的正则表达式来拆分字符串。
注意: . 、 $、 | 和 * 等转义字符,必须得加 \\。
注意:多个分隔符,可以用 | 作为连字符。
trim() 方法用于删除字符串的头尾空白符。
参考:
网友评论