LC165. 比较版本号【利用 stringstream + getline 做字符串分割】

张开发
2026/5/22 21:23:28 15 分钟阅读
LC165. 比较版本号【利用 stringstream + getline 做字符串分割】
165. 比较版本号给你两个版本号字符串version1和version2请你比较它们。版本号由被点.分开的修订号组成。修订号的值是它转换为整数并忽略前导零。比较版本号时请按从左到右的顺序依次比较它们的修订号。如果其中一个版本字符串的修订号较少则将缺失的修订号视为0。返回规则如下如果*version1* *version2*返回-1如果*version1* *version2*返回1除此之外返回0。示例 1**输入**version1 “1.2”, version2 “1.10”输出-1解释version1 的第二个修订号为 “2”version2 的第二个修订号为 “10”2 10所以 version1 version2。示例 2**输入**version1 “1.01”, version2 “1.001”**输出**0解释忽略前导零“01” 和 “001” 都代表相同的整数 “1”。示例 3**输入**version1 “1.0”, version2 “1.0.0.0”**输出**0解释version1 有更少的修订号每个缺失的修订号按 “0” 处理。提示1 version1.length, version2.length 500version1和version2仅包含数字和.version1和version2都是有效版本号version1和version2的所有修订号都可以存储在32 位整数中字符串分割思路很简单就是将字符串version分割为整形数字的集合然后比大小就行。对于字符串分割一种朴素的写法是这样的vectorintsplit(string version){vectorintres;string cur;for(autox:version){if(x.){// cout cur: cur endl;res.push_back(stoi(cur));cur.clear();}elsecurx;}// 最后一次 push 要判断一下if(!cur.empty())res.push_back(stoi(cur));// for(auto x : res) cout x ; cout endl;while(!res.empty()res.back()0)res.pop_back();returnres;}很麻烦还要注意尾部的问题。但其实我们有更好的写法那就是利用stringstream getline。对于getline我们有一个误解那就是以为它每次是 get 一行就和它的名字一样但其实不是这样的。getline实际上是以分隔符默认为换行符\n作为标志 get 字符串的。那么只要我们指定这个分隔符为我们的目标分隔符例如.再将需要分割的字符串转换为字符串流内存流stringstream就可以通过getline简单实现字符串的分割。所以这里的字符串分割就可以写为下面的形式classSolution{vectorintsplit(stringversion,chardeli){stringstreamss(version);vectorintres;string token;while(getline(ss,token,deli))res.push_back(stoi(token));returnres;}public:intcompareVersion(string version1,string version2){autos1split(version1,.),s2split(version2,.);for(inti0;is1.size()||is2.size();i){intn1is1.size()?s1[i]:0;intn2is2.size()?s2[i]:0;if(n1!n2)returnn1n2?-1:1;}return0;}};

更多文章