比较版本号字符串

时间:2019-09-17 11:15:46

标签: c++ algorithm c++11

“以下是我正在尝试的问题的链接。

https://www.interviewbit.com/problems/compare-version-numbers/

我模拟了数组以比较两个版本。但是我在代码中找不到任何错误。”

 int compareVersion(string A, string B) {

// vnum1,vnum2存储版本A和B的每个数字部分

      long long int vnum1 = 0, vnum2 = 0; 

//循环直到两个字符串都被处理

    //  storing numeric part of version A in vnum1 
    int i=0,j=0;
    while(i<A.length()||j<B.length()){


    while (i < A.length()&&A[i]!='.') 
    {    
        vnum1 = vnum1 * 10 + (A[i]-'0'); 
        i++; 
    } 

    //  storing numeric part of version B in vnum2 
    while (j < B.length()&&B[j]!='.') 
    { 
        vnum2 = vnum2 * 10 + (B[j] - '0'); 
        j++; 
    } 

    if (vnum1 > vnum2) 
        return 1; 
   else  if (vnum2 > vnum1) 
        return -1; 

    //  if equal, reset variables and go for next numeric 

    vnum1=0;
    vnum2=0;
    i++;
    j++;

   }  return 0; 
   }

输入

A="444444444444444444444444"
B="4444444444444444444444444"

实际

 1

预期

-1

1 个答案:

答案 0 :(得分:0)

将版本号视为以点分隔的字符串。从每个输入字符串中获取第一个并进行比较。如果它们不相等,则可以立即返回结果,否则将得到下一个用点分隔的数字,依此类推,直到到达字符串的末尾。

std::istringstreamstd::getlinestd::stoll可以为您提供帮助。


如果版本号可以是任意长度,则仍可以将其视为点分隔输入,并使用std::istringstreamstd::getline将版本号提取为字符串。但是,除了将它们转换为可以比较的整数之外,您需要逐个字符地进行检查。

第一个从字符串开始的零开头的条带(例如"01"变成"1")。然后比较字符串的长度。较长的字符串将始终更大。

一旦您超过了该阶段,就获取最低有效数字(字符串中的最后一个字符)并进行简单的字符比较(C ++规范中的措辞表明,字符'1'始终较小比字符'2')。只要字符相等,就可以向后遍历字符串,逐个字符地进行比较。