QR3. 寻找Coder
描述
请设计一个高效算法,再给定的字符串数组中,找到包含"Coder"的字符串(不区分大小写),并将其作为一个新的数组返回。结果字符串的顺序按照"Coder"出现的次数递减排列,若两个串中"Coder"出现的次数相同,则保持他们在原数组中的位置关系。
给定一个字符串数组A和它的大小n,请返回结果数组。保证原数组大小小于等于300,其中每个串的长度小于等于200。同时保证一定存在包含coder的字符串。
["i am a coder","Coder Coder","Code"],3
返回:["Coder Coder","i am a coder"]
C++ 解法, 执行用时: 5ms, 内存消耗: 552KB, 提交时间: 2021-12-20
class Coder { public: string Up_to_Low(string s){ string ret=s; for(int i=0;i<s.size();i++){ if(s[i]>='A'&&s[i]<='Z'){ ret[i]=s[i]+32; } } return ret; } static bool cmp(const pair<string,int> a,const pair<string,int> b){ return a.second>b.second; } vector<string> findCoder(vector<string> A, int n) { // write code here vector<pair<string,int> > arr; for(int i=0;i<n;i++){ string str=Up_to_Low(A[i]); int count=0; int pos=str.find("coder"); while(pos!=-1){ str=str.substr(pos+5); pos=str.find("coder"); count++; } if(count!=0){ arr.push_back(make_pair(A[i], count)); } } stable_sort(arr.begin(),arr.end(),cmp); vector<string> res; for(int i=0;i<arr.size();i++){ res.push_back(arr[i].first); } return res; } };
C++ 解法, 执行用时: 5ms, 内存消耗: 552KB, 提交时间: 2021-11-15
class Coder { public: //1.首先将字符串全部表示为小写形式 string change(string str){ string ans = str; for(int i = 0; i < str.size(); i++){ if(str[i] >= 'A' && str[i] <= 'Z'){ ans[i] = str[i] + 32; } } return ans; } //3.按照coder的次数排序 static bool cmp(const pair<string, int>& a, const pair<string, int>& b){ return a.second > b.second; } vector<string> findCoder(vector<string> A, int n) { // write code here //2.利用find函数循环查找是否包含coder,并统计包含coder的个数 vector<pair<string, int>> array; for(int i = 0; i < n; i++){ string str = change(A[i]); int countnum = 0; int pos = str.find("coder"); //string的查找,没找到返回-1 //利用下面这个循环查找一个字符串中包含coder的数量 while(pos!=-1){ str = str.substr(pos+5); //截取剩下的子串 pos = str.find("coder"); countnum++; } if(countnum != 0){ //字符串中包含“coder” array.push_back(make_pair(A[i], countnum)); } } //排序 stable_sort(array.begin(),array.end(), cmp); vector<string> ans; for(int i = 0; i< array.size(); i++){ ans.push_back(array[i].first); } return ans; } };
C++ 解法, 执行用时: 5ms, 内存消耗: 552KB, 提交时间: 2021-09-07
bool cmp(const pair<string,int>& a,const pair<string,int>& b){ return a.second>b.second; } class Coder { public: string change(string str){ string ans=str; for(int i=0;i<str.length();i++) if(str[i]>='A'&&str[i]<='Z') ans[i]=str[i]+32; return ans; } vector<string> findCoder(vector<string> A, int n) { vector<pair<string,int> > array; for(int i=0;i<n;i++){ string str=change(A[i]); int length=0; int pos=str.find("coder"); while(pos!=-1){ str=str.substr(pos+5); pos=str.find("coder"); length++; } if(length!=0) array.push_back(make_pair(A[i],length)); } stable_sort(array.begin(),array.end(),cmp); vector<string> ans; for(int i=0;i<array.size();i++){ ans.push_back(array[i].first); } return ans; } };
C++ 解法, 执行用时: 5ms, 内存消耗: 556KB, 提交时间: 2022-06-13
class Coder { public: vector<string> findCoder(vector<string> A, int n) { // write code here string t = "coder"; vector<tuple<string,int,int>> vec; int id = 0; for(auto xx:A){ string tt = xx; for(int i=0;i<(int)tt.size();++i) tt[i] = tolower(tt[i]); int cnt = 0; for(int i=0,j=0;i<(int)tt.size();++i){ while(j && t[j]!=tt[i]) j = 0; if(t[j]==tt[i]) j++; if(j==5){ cnt ++; j = 0; } } if(cnt) vec.emplace_back(make_tuple(xx, cnt, id)); id++; } sort(vec.begin(),vec.end(),[&](const tuple<string,int,int> &x1, const tuple<string,int,int> &x2){ if(get<1>(x1) == get<1>(x2)) return get<2>(x1) < get<2>(x2); return get<1>(x1) > get<1>(x2); }); vector<string> ans; for(auto [x,y,z]:vec) ans.emplace_back(x); return ans; } };
C++ 解法, 执行用时: 5ms, 内存消耗: 560KB, 提交时间: 2021-08-24
class Coder { public: vector<string> findCoder(vector<string> A, int n) { pair<int, int> P[310]; int cnt = 0; for(int i=0;i<n;i++){ string str=A[i]; for(int j=0; j<str.size();j++) if(str[j] <= 'Z') str[j] = str[j] + 32; int ss = 0; int pos=str.find("coder"); while(pos!=-1){ str=str.substr(pos+5); pos=str.find("coder"); ss -- ; } if(ss!=0) P[cnt++] = make_pair(ss,i); } sort(P,P+cnt); vector<string> ans; for(int i=0;i<cnt;i++){ ans.push_back(A[P[i].second]); } return ans; } };