“以下是我正在尝试的问题的链接。
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
答案 0 :(得分:0)
将版本号视为以点分隔的字符串。从每个输入字符串中获取第一个并进行比较。如果它们不相等,则可以立即返回结果,否则将得到下一个用点分隔的数字,依此类推,直到到达字符串的末尾。
std::istringstream
和std::getline
和std::stoll
可以为您提供帮助。
如果版本号可以是任意长度,则仍可以将其视为点分隔输入,并使用std::istringstream
和std::getline
将版本号提取为字符串。但是,除了将它们转换为可以比较的整数之外,您需要逐个字符地进行检查。
第一个从字符串开始的零开头的条带(例如"01"
变成"1"
)。然后比较字符串的长度。较长的字符串将始终更大。
一旦您超过了该阶段,就获取最低有效数字(字符串中的最后一个字符)并进行简单的字符比较(C ++规范中的措辞表明,字符'1'
始终较小比字符'2'
)。只要字符相等,就可以向后遍历字符串,逐个字符地进行比较。