ニウケインタビュー必筆:BM22のバージョン番号比較

ニウケインタビュー必筆:BM22のバージョン番号比較


序文

Niuke プロジェクトには、プロジェクト バージョンのリリース時に 1.02.11、2.14.4 などのバージョン番号が付けられます。

次に、2 つのバージョン番号 version1 と version2 を提示します。そのサイズを比較してください。

バージョン番号はリビジョン番号で構成され、リビジョン番号は「.」で結ばれます。リビジョン番号は複数の数字で構成され、リビジョン番号の先頭に 0 が含まれる場合がありますが、これは正当です。たとえば、1.02.11、0.1、0.2 はすべて有効なバージョン番号です。
各バージョン番号には少なくとも 1 つのリビジョン番号が含まれます。
リビジョン番号は左から右に番号が付けられ、添字は 0 から始まり、左端のリビジョン番号の添字は 0、次のリビジョン番号の添字は 1 というようになります。

比較規則:
1. バージョン番号を比較する場合は、左から右の順にリビジョン番号を比較してください。リビジョン番号を比較する場合は、先頭のゼロを無視して単純に整数値を比較します。たとえば、「0.1」と「0.01」のバージョン番号は等しい
2. バージョン番号の添え字にリビジョン番号が指定されていない場合、リビジョン番号は 0 とみなされます。たとえば、「1.1」のバージョン番号は「1.1.1」よりも低くなります。「1.1」のバージョン番号は「1.1.0」と同等であるため、3 番目のリビジョン番号の添字は 0 で、13 より小さいです。 version1
> version2 は 1 を返し、version1 < version2 が -1 を返す場合、それ以外の場合は 0 を返します。 。


1. 解決策 1: セグメンテーションと傍受

一つ目の方法は、文字をドットを境にその都度数値に変換する方法なので、事前に分割してみることはできないでしょうか?分割自体は難しくなく、JavaやPyhtonのsplit関数を使えば点の間隔に従って直接分割することができます。C++ にはそのような便利な分割関数はありませんが、ストリーム入力 isstringstream があり、文字変数を使用してポイントを引き継ぐだけでよく、他の部分は徐々に配列に入力されます。

具体的な方法:
ステップ 1: 分割関数または文字列ストリーム入力を使用して、ポイントに従って 2 つの元の文字列を分割し、各リビジョン番号の桁が配列内で別々に表示されるようにします。
ステップ 2: 配列を走査し、比較するたびに数値を取り出します。短いバージョン番号に適切な数値がない場合は、直接 0 を取り出します。
ステップ 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;
    }
}

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_46119575/article/details/130695412