比较版本号字符串
Posted
技术标签:
【中文标题】比较版本号字符串【英文标题】:Compare version number strings 【发布时间】:2019-09-17 11:15:46 【问题描述】:“以下是我正在尝试的问题的链接。
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】:将版本号视为以点分隔的字符串。从每个输入字符串中获取第一个并进行比较。如果它们不相等,你可以立即返回结果,否则你会得到下一个点分隔的数字,依此类推,直到你到达字符串的末尾。
std::istringstream
和 std::getline
和 std::stoll
可以帮助您。
如果版本号可以是任意长度,您仍然可以将其视为以点分隔的输入,并使用std::istringstream
和std::getline
将数字提取为字符串。但是,与其将它们转换为可以比较的整数,不如逐个字符地检查。
首先从字符串中去除前导零(例如,"01"
变为 "1"
)。然后比较字符串的长度。较长的字符串总是会更大。
一旦你过了那个阶段,获取最低有效数字(字符串中的最后一个字符)并进行简单的字符比较(C++ 规范有这样的措辞,即字符 '1'
将始终小于字符'2'
)。只要字符相等,您就可以向后迭代字符串,逐个字符进行比较。
【讨论】:
以上是关于比较版本号字符串的主要内容,如果未能解决你的问题,请参考以下文章