Compare Version Numbers
來源:程序員人生 發布時間:2015-01-16 08:15:15 閱讀次數:2769次
本文是在學習中的總結,歡迎轉載但請注明出處:http://blog.csdn.net/pistolove/article/details/42342251
Compare two version numbers version1 and version1.
If version1 > version2 return 1, if version1 < version2 return ⑴, 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)題意為比較版本號大小。但是版本號可以包括多個小數點,例如1.0.0.1和1.0.0.0.2這樣的情況也會產生。
(2)判斷進程分為幾種情況:如果給定的版本號包括“.”,則需要將其中的字符分開并存到鏈表中,如果不包括,則直接存入鏈表便可。
(3)兩個版本號都存入到鏈表,遍歷較長的鏈表,進行比較判斷,直到從兩個鏈表取出的字符對應的整數值不相等,則返回判斷得到的值;如果遍歷完較短的鏈表還未判斷出大小,則視較短鏈表后續元素為0與較長鏈表進行比較,直到較長鏈表遍歷完成為止,返回對應的值。(由于可能出現類似1.1.0.0.0、1.1.0.0.1和1.1之間的比較,此時必須遍歷完較長的鏈表)
(4)下面簡單舉例子說明:
對1.1.0.1和1.1.0
a:對應的鏈表(以數組表示)為[1,1,0,1]和[1,1,0]
b:遍歷完前3次后,其對應的位置上的值都相等,而此時[1,1,0]所有元素都遍歷完了,但是還需要繼續,將[1,1,0]“第4個位置”元素設為 0進行比較,此時得到1,1,0,1]對應的元素要大于0,即1.1.0.1 > 1.1.0,返回對應結果。
c:類似1.1.1.0和1.1.1.0.0的比較類似,在此不舉例子說明。
(5)代碼很長,但是思路還是比較清晰的,希望對你有所幫助。
算法代碼實現以下:
public static int compareVersion(String version1, String version2) {
List<String> list1 = new LinkedList<String>();
if(version1.contains(".")){
char[] charArray = version1.toCharArray();
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < charArray.length; i++) {
if(charArray[i]!='.'){
buffer.append(charArray[i]);
if(i==charArray.length⑴){
list1.add(buffer.toString());
}
}else{
list1.add(buffer.toString());
buffer.setLength(0);
}
}
}else{
list1.add(version1);
}
List<String> list2 = new LinkedList<String>();
if(version2.contains(".")){
char[] charArray = version2.toCharArray();
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < charArray.length; i++) {
if(charArray[i]!='.'){
buffer.append(charArray[i]);
if(i==charArray.length⑴){
list2.add(buffer.toString());
}
}else{
list2.add(buffer.toString());
buffer.setLength(0);
}
}
}else{
list2.add(version2);
}
int max = list1.size() >= list2.size()? list1.size():list2.size();
for (int i = 0; i < max; i++) {
if(list1.size()>=list2.size()){
if(i>list2.size()⑴){
if(compare(list1.get(i),"0")==0){
continue;
}else{
return compare(list1.get(i),"0");
}
}else{
if(compare(list1.get(i),list2.get(i))==0){
continue;
}else{
return compare(list1.get(i),list2.get(i));
}
}
}
if(list2.size()>list1.size()){
if(i>list1.size()⑴){
if(compare("0",list2.get(i))==0){
continue;
}else{
return compare("0",list2.get(i));
}
}else{
if(compare(list1.get(i),list2.get(i))==0){
continue;
}else{
return compare(list1.get(i),list2.get(i));
}
}
}
}
return 0;
}
public static int compare(String s1, String s2){
int v1 = Integer.parseInt(s1);
int v2 = Integer.parseInt(s2);
if(v1>v2){
return 1;
}else if(v1<v2){
return ⑴;
}else{
return 0;
}
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈