165. 比较版本号 - 力扣(LeetCode) (leetcode-cn.com)
#include<iostream> #include<string> #include<algorithm> #include<vector> #include<sstream> using namespace std; string fort_zero(string& s) { bool flag=0; int left=0,right=0,len=s.size(); string res; while(left<len){ if((flag==0)&&(s[left++] != '0')) { flag=1;break; } } if(flag==1) s.erase(0,left-1); else s="0"; return s; } int main() { cout<<("2">"10")<<endl; string s1="1"; string s2="0"; vector<string> mids1; vector<string> mids2; string flag; if(s1.find('.')==-1) mids1.push_back(s1); else{ stringstream ss(s1); while(getline(ss,flag,'.')) { mids1.push_back(flag); } } if(s2.find('.')==-1) mids2.push_back(s2); else{ stringstream ss1(s2); while(getline(ss1,flag,'.')) { mids2.push_back(flag); } } for(auto a:mids1) cout<<a<<" "; cout<<endl; for(auto a:mids2) cout<<a<<" "; cout<<endl; for(auto &a:mids1) fort_zero(a); for(auto &a:mids2) fort_zero(a); while((mids1.back()=="0")&&(mids1.size()!=1)) mids1.pop_back(); while((mids2.back()=="0")&&(mids2.size()!=1)) mids2.pop_back(); for(auto a:mids1) cout<<a<<" "; cout<<endl; for(auto a:mids2) cout<<a<<" "; int minlen=mids1<mids2? mids1.size():mids2.size(); for(int i=0;i<minlen;i++) { if(mids1[i]>mids2[i]) return 1; else if(mids1[i]<mids2[i]) return -1; } if(mids1.size()==mids2.size()) return 0; if(mids1.size()>mids2.size()) return 1; if(mids1.size()<mids2.size()) return -1; }
string fort_zero(string& s) { bool flag=0; int left=0,right=0,len=s.size(); string res; while(left<len){ if((flag==0)&&(s[left++] != '0')) { flag=1;break; } } if(flag==1) s.erase(0,left-1); else s="0"; return s; } class Solution { public: int compareVersion(string s1, string s2) { vector<string> mids1; vector<string> mids2; //stringstream 分割'.' string flag; stringstream ss(s1); while(getline(ss,flag,'.')) mids1.push_back(flag); stringstream ss1(s2); while(getline(ss1,flag,'.')) mids2.push_back(flag); //把分割的字符串消除前缀0,全0变成单个0 for(auto &a:mids1) fort_zero(a); for(auto &a:mids2) fort_zero(a); //把容器中后面的只有0的删除,保留容器的第一个 while((mids1.back()=="0")&&(mids1.size()!=1)) mids1.pop_back(); while((mids2.back()=="0")&&(mids2.size()!=1)) mids2.pop_back(); //依次比较容器字符串,先比长度再比ascii码 int minlen=mids1<mids2? mids1.size():mids2.size(); for(int i=0;i<minlen;i++) { if(mids1[i].size()>mids2[i].size()) return 1; if(mids1[i].size()<mids2[i].size()) return -1; else{ if(mids1[i]>mids2[i]) return 1; else if(mids1[i]<mids2[i]) return -1; } } if(mids1.size()==mids2.size()) return 0; else if(mids1.size()>mids2.size()) return 1; else return -1; } };
/* 在 C++ 中,可以使用 istringstream 配合 getline 根据分隔符来分割字符串。 istringstream, ostringstream, stringstream区别# 这 3 个 stream 都可以通过头文件 #include <sstream> 引入。三者的区别如下: ostringstream : 用于执行 C 风格字符串的输出操作。 istringstream : 用于执行 C 风格字符串的输入操作。 stringstream : 同时支持 C 风格字符串的输入输出操作。 首先,我们使用一个字符串s来初始化输入字符串流istringstream string s = "a/b/c/d"; istringstream iss(s); 然后,我们使用 getline 函数通过 iss 对字符串进行分割,getline 函数的原型为 istream& getline ( istream &is , string &str , char delim ); 第一个参数为 is 表示一个 istringstream,这里就是 iss, 第二个参数表示我们要将字符串分割的结果通过 getline 逐个放入 str 中, 第三个参数为分隔符,注意分隔符只能为字符型。示例如下: */ //#include <sstream> //#include <iostream> //#include <vector> //using namespace std; //int main() //{ // string s = "a/b/c/d"; // vector<string> res; // stringstream iss(s); // string buffer; // while(getline(iss, buffer, '/')) // { // res.push_back(buffer); // } // for(auto s:res) cout<<s<<" "; // return 0; //} //#include <sstream> //#include <iostream> //#include <vector> //using namespace std; //int main() //{ // string s = "001/0020/0220/012"; // vector<int> res; // stringstream iss(s); // int buffer; // while(getline(iss, buffer, '/'))//[Error] no matching function for call to 'getline(std::stringstream&, int&, char)' // { // res.push_back(buffer); // } // for(auto s:res) cout<<s<<" "; // return 0; //} //字符串分离数字比较大小 //#模板一 中间是空格 /* #include <sstream> #include <iostream> #include <vector> using namespace std; int main() { string s = "001 0020 0220 012"; vector<int> res; stringstream iss(s); int buffer; while(iss>>buffer) { res.push_back(buffer); } for(auto s:res) cout<<s<<" ";//1 20 220 12 return 0; } */ //字符串分离数字比较大小 //#模板二 中间是单个字符 /* #include <sstream> #include <iostream> #include <vector> using namespace std; int main() { string s = "001.0020.0220.012"; vector<int> res; stringstream iss(s); int buffer; //要想变string直接令类型 char c; while(iss>>buffer) { res.push_back(buffer); iss>>c; //这个c可以用于任何字符不过只能是单个 } for(auto s:res) cout<<s<<" ";//1 20 220 12 return 0; } */ //字符串分离数字比较大小 //#模板三 中间是多个字符 将其变成类型一 #include <sstream> #include <iostream> #include <vector> using namespace std; int main() { string s = "001..0020...0220....012"; for(char &a:s) if(a<'0'&&a>'9') a=' '; 没有写完 vector<int> res; stringstream iss(s); int buffer; //要想变string直接令类型 while(iss>>buffer) { res.push_back(buffer); } for(auto s:res) cout<<s<<" ";//1 20 220 12 return 0; } //封装# //可以将字符串分割简单地封装成一个split函数: //#include <sstream> //#include <iostream> //#include <vector> //using namespace std; ///** //*分割字符串,输入待分割的字符串s以及分割符sep; //*这里没有对分割可能得到的空串进行处理,可以直接删除空串 //*/ //vector<string> split(string s, char sep) //{ // istringstream iss(s); // vector<string> res; // string buffer; // while(getline(iss, buffer, sep)){ // res.push_back(buffer); // } // return res; //} // //int main() //{ // string s = "a/b/c/d"; // vector<string> res = split(s, '/'); // for(int i=0; i<res.size(); i++) cout<<res[i]<<" "; // cout<<endl; // return 0; //} //#include <string> //#include <sstream> //#include <iostream> //#include <stdio.h> // //using namespace std; // //int main() //{ // stringstream sstream; // string strResult; // int nValue = 1000; // // 将int类型的值放入输入流中 // sstream << nValue; // // 从sstream中抽取前面插入的int类型的值,赋给string类型 // sstream >> strResult; // cout << strResult << endl; // // //注意都是stringstream在前面然后>>或者<< // stringstream sstream1; // string a="000001110.514"; // int b; // sstream1 << a; // sstream1 >> b; // cout<<b<<endl; //1110 // // char c; // sstream1>>c; // cout<<c<<endl; //. // // sstream1>>b; // cout<<b<<endl; //514 // // return 0; //}