列表

详情


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;
    }
};

上一题