首页 > 试题广场 >

比较两个版本字符串version1和version2

[编程题]比较两个版本字符串version1和version2
  • 热度指数:4528 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

如果version1 > version2 返回1,如果 version1 < version2 返回-1,不然返回0.

输入的version字符串非空,只包含数字和字符..字符不代表通常意义上的小数点,只是用来区分数字序列。例如字符串2.5并不代表二点五,只是代表版本是第一级版本号是2,第二级版本号是5.


输入描述:
两个字符串,用空格分割。
每个字符串为一个version字符串,非空,只包含数字和字符.


输出描述:
只能输出1, -1,或0
示例1

输入

0.1 1.1

输出

-1

备注:
version1和version2的长度不超过1000,由小数点'.'分隔的每个数字不超过256。
//用c语言的scanf输入int判断更便捷;
#include <bits/stdc++.h>
using namespace std;
int main(){
    vector<int> arr1,arr2;
    int i=0,t;
    while(1){
        if(cin.peek()==' ')
            break;
        scanf("%d.",&t);
        arr1.push_back(t);
    }
    while(1){
        if(cin.peek()=='\n')
            break;
        scanf("%d.",&t);
        arr2.push_back(t);
    }
    while(i!=arr1.size()&&i!=arr2.size()){
        if(arr1[i]!=arr2[i]){
            t=arr1[i]>arr2[i] ? 1:-1;
            break;
        }
        i++;
    }
    if(i==arr1.size()||i==arr2.size()){
        if(arr1.size()==arr2.size())
            t=0;
        else
            t= arr1.size()>arr2.size() ? 1:-1;
    }
    cout<<t;
    return 0;
}

发表于 2019-11-13 10:06:33 回复(0)
x,y = map(lambda x:list(map(int, x.split('.'))), input().split())
if x > y: print(1)
elif x < y: print(-1)
else: print(0)

发表于 2019-09-12 05:09:41 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] v1 = sc.next().split("\\.");
        String[] v2 = sc.next().split("\\.");
        int len = Math.max(v1.length, v2.length);
        int[] num1 = new int[len];
        int[] num2 = new int[len];
        for (int i = 0; i < v1.length; i++) {
            num1[i] = Integer.parseInt(v1[i]);
        }
        for (int i = 0; i < v2.length; i++) {
            num2[i] = Integer.parseInt(v2[i]);
        }
        int index = 0;
        while (index < len) {
            if (num1[index] < num2[index]) {
                System.out.println(-1);
                return;
            } else if (num1[index] > num2[index]) {
                System.out.println(1);
                return;
            } else {
                index++;
            }
        }
        System.out.println(0);
    }
}
发表于 2019-08-20 15:13:28 回复(0)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while((line = br.readLine()) != null){
            String[] strArr = line.trim().split(" ");
            System.out.println(solve(strArr[0], strArr[1]));
        }
    }
    
    private static int solve(String version1, String version2) {
        String[] version1Split = version1.split("\\.");
        String[] version2Split = version2.split("\\.");
        int idx = 0;
        // 逐位比较版本号
        while(idx < version1Split.length && idx < version2Split.length){
            // 有大小关系时直接返回比较结果,否则跳到下一位进行比较
            if(Integer.parseInt(version1Split[idx]) > Integer.parseInt(version2Split[idx]))
                return 1;
            else if(Integer.parseInt(version1Split[idx]) < Integer.parseInt(version2Split[idx]))
                return -1;
            else
                idx ++;
        }
        // 两个版本号的公共长度相同,谁长谁大
        if(idx < version1Split.length)
            return 1;
        else if(idx < version2Split.length)
            return -1;
        else
            return 0;
    }
}

发表于 2020-10-26 11:26:48 回复(0)
/*
不仅要考虑字符串长度相同还要考虑不同的时候
*/
import java.io.*;
    
public class Main{
    public static void main( String[] args ) throws IOException{
        BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) );
        String[] inarr = br.readLine().split( " " );
        String[] str1 = inarr[0].split("\\.");
        String[] str2 = inarr[1].split("\\.");
        
        //先直接进行比较,看看谁的版本高
        for( int i=0; i<str1.length && i<str2.length; i++ ){
            if( Integer.parseInt( str1[i] ) < Integer.parseInt( str2[i] ) ){
                System.out.println( "-1" );
                return;
            }
            else if( Integer.parseInt( str1[i] ) > Integer.parseInt( str2[i]) ){
                System.out.println( "1" );
                return;
            }
        }
        
        //当前面的比较没有成功,有如下情况
        //长度相同时版本一致,
        //一长一短,并且短的部分与长的前面相同
        if( str1.length == str2.length ){
            System.out.println( "0" );
        }
        else if( str1.length < str2.length ){
            System.out.println( "-1" );
        }
        else{
            System.out.println( "1" );
        }
        return;
    }
}

发表于 2020-05-23 15:20:20 回复(0)
#include <bits/stdc++.h>
using namespace std;

int Cmp(string a, string b){
    if(a==b)
        return 0;
    int m = a.length(), n = b.length();
    int i=0, j=0, p=0, q=0;
    while(i<m && j<n){
        while(i<m && a[i]!='.')
            i++;
        string c = a.substr(p,i-p);
        i++;
        p = i;

        while(j<n && b[j]!='.')
            j++;
            
        string d = b.substr(q,j-q);
        j++;
        q = j;

        if(c==d)
            continue;
        
        if(stoi(c)>stoi(d))
            return 1;
        else
            return -1;
    }
    if(i>=m && j<n)
        return -1;
    if(i<m && j>=n)
        return 1;
    return 0;
}

int main(){
    string a,b;
    cin>>a>>b;
    cout<<Cmp(a,b)<<endl;
    return 0;
}

发表于 2019-10-02 21:26:21 回复(0)
def main():
    a = list(input().split(" "))
    b, c = [list(map(int,it.split("."))) for it in a]
    l = abs(len(b) - len(c))
    if l and len(b) > len(c):
        c += [0] * l
    if l and len(b) < len(c):
        b += [0] * l
    for c1, c2 in zip(b, c):
        if c1 > c2:
            print(1)
            return
        elif c1 < c2:
            print(-1)
            return
    print(0)
if __name__ == "__main__":
    main()

发表于 2019-09-19 09:10:07 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s1,s2;
    cin>>s1>>s2;
    int n1=0,n2=0,i=0,j=0;
    while(i<s1.size()||j<s2.size())
    {
        if(i==s1.size()&&j<s2.size())
        {
            cout<<-1<<endl;
            break;
        }
        if(i<s1.size()&&j==s2.size())
        {
            cout<<1<<endl;
            break;
        }
        if(i>=s1.size()&&j>=s2.size())
        {
            cout<<0<<endl;
            break;
        }
        if(s1[i]!='.'&&i<s1.size())
        {
            n1 += n1*10 + s1[i] - '0';
            ++i;
        }
        if(s2[j]!='.'&&j<s2.size())
        {
            n2 += n2*10 + s2[j] - '0';
            ++j;
        }
        if(s1[i]=='.'&&s2[j]=='.')
        {
            if(n1>n2)
            {
                cout<<1<<endl;
                break;
            }
            else if(n1<n2)
            {
                cout<<-1<<endl;
                break;
            }
            else
            {
                n1=0;
                n2=0;
                i++;
                j++;
            }
        }
    }
    if(i==s1.size()&&j==s2.size())
    {
        if(n1>n2)
           cout<<1<<endl;
        else if(n1<n2)
            cout<<-1<<endl;
        else
            cout<<0<<endl;
    }
    return 0;
}

发表于 2019-07-23 09:19:17 回复(0)
# Python3 代码---完全通过版

def judgeTwoVersion(str0):
    a, b = str0[0], str0[1]
    # 将字符串转存为两个列表
    list_a, list_b = a.split('.'), b.split('.') 
    # 求最小的长度,考虑到两个字符串可能出现长度不等的情况
    mylen = min(len(list_a), len(list_b))

    # 等长度判断
    for i in range(mylen):
        if int(list_a[i]) < int(list_b[i]):
            print('-1')
            break
        elif int(list_a[i]) > int(list_b[i]):
            print('1')
            break
        elif int(list_a[i]) == int(list_b[i]):
            continue

    # 非等长度判断 
    if i == mylen - 1 and list_a[mylen - 1] == list_b[mylen - 1]:
        if len(list_a) > len(list_b):
            print('1')
        elif len(list_a) < len(list_b):
            print('-1')
        elif len(list_a) == len(list_b):
            print('0')

# 主函数
if __name__ == '__main__':
    str0 = [i for i in input().split()]    # 输入字符串
    judgeTwoVersion(str0)                  # 输出判断结果


需要注意的2个问题:

  • 两个字符串的长度可能不同;
  • 输入的字符串中可能出现多个.。
代码仍然存在优化改进的地方。

编辑于 2019-05-12 14:42:36 回复(1)
# python中的列表可以直接比较,只要把输入的数字按照'.'分割后,换为整数列表即可。
num = input().split()
version1 = list(map(int, num[0].split(".")))
version2 = list(map(int, num[1].split(".")))
if version1<version2:
    print(-1)
elif version1>version2:
    print(1)
else:
    print(0)
#print(version1, version2)

发表于 2019-07-04 11:09:50 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String input1 = in.next();
        String input2 = in.next();
        if (input1.equals(input2)) {
            System.out.println(0);
            return;
        }
        String[] v1 = input1.split("\\.");
        String[] v2 = input2.split("\\.");
        int len1 = v1.length;
        int len2 = v2.length;
        for (int i = 0; i < Math.min(len1, len2); i++) {
            if (Integer.parseInt(v1[i]) < Integer.parseInt(v2[i])) {
                System.out.println(-1);
                return;
            } else if (Integer.parseInt(v1[i]) > Integer.parseInt(v2[i])) {
                System.out.println(1);
                return;
            }
        }
        //可能一个版本号是另一个版本的子串,也有可能完全相同
        if (len1 < len2) {
            System.out.println(-1);
            return;
        } else if (len1 > len2) {
            System.out.println(1);
            return;
        } else {
            System.out.println(0);
            return;
        }
    }
}


发表于 2024-11-01 20:47:17 回复(0)
拆开来一级一级比较就行了。注意版本号可能段数不同,需要在相同段数比较之后再做判断。

class MainActivity:

    def main(self):
        # Read the data
        v1, v2 = filter(lambda x: len(x) > 0, input().split(' '))
        v1 = list(map(int, v1.split('.')))
        v2 = list(map(int, v2.split('.')))
        # Compare
        flag = True
        if len(v1) > len(v2):
            v1, v2 = v2, v1
            flag = False
        for ptr in range(len(v1)):
            if v1[ptr] < v2[ptr]:
                print(-1 if flag else 1)
                return
            elif v1[ptr] > v2[ptr]:
                print(1 if flag else -1)
                return
        if len(v2) > len(v1):
            print(-1 if flag else 1)
        else:
            print(0)


if __name__ == '__main__':
    M = MainActivity()
    M.main()
发表于 2024-08-26 17:19:40 回复(0)
package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	str1,str2:="",""
	fmt.Scan(&str1,&str2)
	if str1==str2{
		fmt.Println(0)
	}else{
		str11:=strings.Split(str1,".")
		str21:=strings.Split(str2,".")
		n:=min(len(str11),len(str21))
		for i:=0;i<n;i++{
			num1,_:=strconv.Atoi(str11[i])
			num2,_:=strconv.Atoi(str21[i])
			if num1>num2{
				fmt.Println(1)
				return
			}else if num1<num2{
				fmt.Println(-1)
				return
			}
		}
		if len(str11)<len(str21){
			fmt.Println(-1)
		}else{
			fmt.Println(1)
		}
	}
}

func min(a,b int) int {
	if a>b{
		return b
	}
	return a
}

发表于 2020-08-16 17:46:52 回复(0)
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int cmp (string s1,string s2)
{
    if(s1.length()==s2.length())
    {
        if(s1==s2)
            return 0;
        else if(s1>s2)
            return 1;
        else 
            return -1;
    }else if(s1.length()>s2.length())
        return 1;
    else 
        return -1;
    
}
int cmp_version(string s1,string s2)
{
    string t1="",t2="";
    int n1=s1.length();
    int n2=s2.length();
    int i=0,j=0;
    int res;
    while(i<n1&&j<n2){
        t1="";
        t2="";
        while(i<n1&&s1[i]!='.')
        {
            t1+=s1[i++];
        }
        while(j<n2&&s2[j]!='.')
        {
            t2+=s2[j++];
        }
        i++;j++;
        res=cmp(t1,t2);
        if(res==1)
            return 1;
        else if(res==-1)
            return -1;
    }
    if(j<n2)return -1;
    if(i<n1)return 1;
    return 0;
}
int main()
{
    string s1,s2;
    cin>>s1>>s2;
    cout<<cmp_version(s1,s2)<<endl;
    return 0;
}
发表于 2020-07-28 22:53:00 回复(0)
#include <iostream>
(720)#include <string>
// #include <stdlib.h>
using namespace std;

int versionCompare(string& version1, string& version2) {
    char* p1 = (char*)version1.data();
    char* p2 = (char*)version2.data();
    int v1, v2;
    while(*p1 || *p2) {
        v1 = v2 = 0;
        if (*p1) v1 = atoi(p1);
        if (*p2) v2 = atoi(p2);
        if (v1 > v2) return 1;
        if (v1 < v2) return -1;
        while (*p1 && *p1 != '.') ++p1;
        if (*p1 == '.') ++p1;
        while (*p2 && *p2 != '.') ++p2;
        if (*p2 == '.') ++p2;
    }
    return 0;
}

int main() {
    string version1, version2;
    while (cin >> version1 >> version2) {
        int ret = versionCompare(version1, version2);
        cout << ret << endl;
    }
    return 0;
}

发表于 2020-03-15 01:09:24 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main()
{
    string version1, version2;
    cin>>version1>>version2;
    int n1 = version1.size(), n2 = version2.size();
    int p1 = 0, p2 = 0;
    while(p1<n1 && p2<n2)
    {
        int start1 = p1, start2 = p2;
        while(p1<n1 && version1[p1]!='.') p1++;
        while(p2<n2 && version2[p2]!='.') p2++;
        int t1 = stoi(version1.substr(start1, p1-start1));
        int t2 = stoi(version2.substr(start2, p2-start2));
        if(t1<t2)
        {
            cout<<-1<<endl;
            return 0;
        }
        else if(t1>t2)
        {
            cout<<1<<endl;
            return 0;
        }
        p1++, p2++;
    }
    if(p1>n1 && p2>n2) 
    {
        cout<<0<<endl;
    }
    else if(p1>n1)
    {
        cout<<-1<<endl;
        return 0;
    }
    else
    {
        cout<<1<<endl;
        return 0;
    }
}

发表于 2019-12-28 14:56:16 回复(0)
实在是太简单了
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
int x[10005], y[10005], c1=1, c2=1;
char a[100005], b[10005];
int main()
{
	cin >> a >> b;
	int l = strlen(a);
	for(int i = 0; i < l; i++)
	{
		if(a[i] == '.')
			c1++;
		else
			x[c1] = x[c1] * 10 + (a[i] - '0');
	}
	l = strlen(b);
	for(int i = 0; i < l; i++)
		if(b[i] == '.')
			c2++;
		else
			y[c2] = y[c2] * 10 + (b[i] - '0');
	for(int i = 1; i <= max(c1,c2); i++)
		if(x[i] < y[i])
	{
		printf("-1\n");
		return 0;
	}
		else if(x[i] > y[i])
	{
		printf("1\n");
		return 0;
	}
	printf("0\n");
	return 0;
}


发表于 2019-11-06 15:07:17 回复(0)
#include <bits/stdc++.h>
using namespace std;
#define Up(i,a,b) for(int i = a; i <= b; i++)
#define ms(a,x) memset(a,x,sizeof(a))
typedef long long ll;

void split(vector<int> &v,string s)   //把字符串s按.分隔开并存入v中
{
    int bg = 0, ed = s.find('.'); 
    int len = s.length()-1;
    Up(i,0,len)
    {
        if(s[i] == '.')
        {  
            ed = i;
            int t = stoi(s.substr(bg,ed-bg));   //获取各级版本号
            // cout << t << endl;
            v.push_back(t);
            bg = ed+1; 
        }
        if(i == len)   //最后一个版本号
        {
            ed = len+1;
            int t = stoi(s.substr(bg,ed-bg));
            //cout << t << endl;
            v.push_back(t);
        }
    }
}

int cmp(vector<int> &v1,vector<int> &v2)
{
    int sz = min(v1.size(),v2.size())-1;
    Up(i,0,sz)
    {
        if(v1[i] < v2[i]) return -1;
        else if(v1[i] > v[2]) return 1;
        else return 0;
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    string s1,s2;
    while(cin >> s1 >> s2)
    {
        vector<int> v1,v2;
        split(v1,s1);   //分割字符串s1
        split(v2,s2);   //分割字符串s2
        //开始比较版本号大小
        cout << cmp(v1,v2) << endl;
    }
    return 0;
}

发表于 2019-10-04 13:42:07 回复(0)
事实证明,C的效率最高
#include <stdio.h>
#include<string.h>
int test(char *ptr1,char *ptr2)
{
	if(atoi(ptr1)>atoi(ptr2))
		return 1;
	else if(atoi(ptr1)<atoi(ptr2))
		return -1;
	else
		return 0;
}
int main()
{
	char tmp;
	char ver1[256];
	char ver2[256];
	scanf("%s",ver1);
	scanf("%s",ver2);
	char *ptr1 = ver1;
	char *ptr2 = ver2;
	int ret = 0;
	
	int i = 0;
	int j = 0;
	int len1 =strlen(ver1);
	int len2 = strlen(ver2);
	while(i< len1 || j< len2)
	{
		while(ver1[i] != '.' && ver1[i] != '\0')
			i++;
		ver1[i] = '\0';
		while(ver2[j] != '.' && ver2[j] != '\0')
			j++;
		ver2[j] = '\0';
		
		ret = test(ptr1,ptr2);
		if(ret == 1)
		{
			printf("1");
			return 0;
		}
		else if(ret == -1)
		{
			printf("-1");
			return 0;
		}

		i++;
		j++;

		ptr1 = ver1+i;
		ptr2 = ver2+j;
	}
	
	if(len1 > len2)
		printf("1");
	else if(len1 < len2)
		printf("-1");
	else
	printf("0");

	
}


发表于 2019-09-20 16:20:59 回复(0)
while(line = readline()){
    var lines = line.split(" ");
    var a = lines[0];
    var b = lines[1];
    var t = a.split(".");
    var y = b.split(".");
    var l1 = t.length;
    var l2 = y.length;
    for(i=0;i<l1;i++){
        t[i]= parseInt(t[i])
    }
        for(i=0;i<l2;i++){
        y[i]= parseInt(y[i])
    }
    var len = Math.min(l1,l2);
    for(i=0;i<len;i++){
        if(t[i]>y[i]){
            print(1);
            break;
        }else if(t[i]<y[i]){
            print(-1);
            break;
        }else if(t[i]==y[i]&&i<len-1){
            continue;
        }else if(t[i]==y[i]&&i==len-1&&len==l1&&len==l2){
            print(0)
        }else if(t[i]==y[i]&&i==len-1&&len==l2){
            print(1)
        }else if(t[i]==y[i]&&i==len-1&&len==l1){
            print(-1)
        }
    }
}

发表于 2019-09-03 10:52:34 回复(0)

热门推荐

通过挑战的用户

查看代码
比较两个版本字符串version1和version2