Compare Version Numbers
來(lái)源:程序員人生 發(fā)布時(shí)間:2015-01-16 08:15:15 閱讀次數(shù):2776次
本文是在學(xué)習(xí)中的總結(jié),歡迎轉(zhuǎn)載但請(qǐng)注明出處: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)題意為比較版本號(hào)大小。但是版本號(hào)可以包括多個(gè)小數(shù)點(diǎn),例如1.0.0.1和1.0.0.0.2這樣的情況也會(huì)產(chǎn)生。
(2)判斷進(jìn)程分為幾種情況:如果給定的版本號(hào)包括“.”,則需要將其中的字符分開并存到鏈表中,如果不包括,則直接存入鏈表便可。
(3)兩個(gè)版本號(hào)都存入到鏈表,遍歷較長(zhǎng)的鏈表,進(jìn)行比較判斷,直到從兩個(gè)鏈表取出的字符對(duì)應(yīng)的整數(shù)值不相等,則返回判斷得到的值;如果遍歷完較短的鏈表還未判斷出大小,則視較短鏈表后續(xù)元素為0與較長(zhǎng)鏈表進(jìn)行比較,直到較長(zhǎng)鏈表遍歷完成為止,返回對(duì)應(yīng)的值。(由于可能出現(xiàn)類似1.1.0.0.0、1.1.0.0.1和1.1之間的比較,此時(shí)必須遍歷完較長(zhǎng)的鏈表)
(4)下面簡(jiǎn)單舉例子說明:
對(duì)1.1.0.1和1.1.0
a:對(duì)應(yīng)的鏈表(以數(shù)組表示)為[1,1,0,1]和[1,1,0]
b:遍歷完前3次后,其對(duì)應(yīng)的位置上的值都相等,而此時(shí)[1,1,0]所有元素都遍歷完了,但是還需要繼續(xù),將[1,1,0]“第4個(gè)位置”元素設(shè)為 0進(jìn)行比較,此時(shí)得到1,1,0,1]對(duì)應(yīng)的元素要大于0,即1.1.0.1 > 1.1.0,返回對(duì)應(yīng)結(jié)果。
c:類似1.1.1.0和1.1.1.0.0的比較類似,在此不舉例子說明。
(5)代碼很長(zhǎng),但是思路還是比較清晰的,希望對(duì)你有所幫助。
算法代碼實(shí)現(xiàn)以下:
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;
}
}
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)