【2022】贝壳找房秋招C++工程师笔试卷1 牛妹的字符串

牛妹的字符串

牛妹拿到了一个只由小写字母组成的字符串s,接下来将字符串执行k次操作,每次操作都会把s中ASCII码最小的字母从s中删除,请返回k次操作之后的字符串s。

参考优秀的网友1:26个小写字母 放在数组里正好由大到小排序。

【2022】贝壳找房秋招C++工程师笔试卷1 牛妹的字符串_第1张图片

memset头文件是 #include cstring

【2022】贝壳找房秋招C++工程师笔试卷1 牛妹的字符串_第2张图片

fill是左闭右开的
【2022】贝壳找房秋招C++工程师笔试卷1 牛妹的字符串_第3张图片

O(n)时间复杂度

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @param k int整型 
     * @return string字符串
     */
    string NS_String(string s, int k) {
        // write code here
        bool f[26];
        memset(f, false, sizeof(f));
        for (char c:s) {
            f[c-'a'] = true;
        }
        for (int i = 0; i < 26&&k; i++) {   // 小写字母从左到右就是按顺序来的
            if(!f[i]) {  //如果f[i]是false 
                continue; //退出循环 什么也不做
            }
            k--;
            f[i] = false;
        }

        string res = "";  //先初始化为空的字符串
        for (char c:s) {
            if(f[c - 'a']) {  //为true
                res += c;  // 或者这样写res.push_back(c);
            }
        }
        return res;
    }
};

在给定的代码中,使用 += 运算符将字符 c 追加到字符串 res 的末尾。这种拼接字符串的操作是合法的,因为在 C++ 中,字符串可以通过不断追加字符来实现动态扩展

在这个特定的代码片段中,开始时字符串 res 被初始化为空字符串 “”。然后,对字符串 s 中的每个字符 c 进行遍历。如果 f[c - ‘a’] 的值为 true,则说明当前字符 c 符合某种条件(这里使用字母表进行了简化),将其追加到字符串 res 的末尾。

通过使用 += 运算符,每次将一个字符追加到字符串的末尾,字符串 res 在循环结束时将包含满足条件的字符组成的子串。

需要注意的是,在对字符串进行频繁的拼接操作时,由于字符串的动态扩展会导致内存分配和复制操作,可能会影响性能。如果涉及大量的字符串拼接操作,可以考虑使用 std::stringstream 或 std::string 的 reserve() 函数预分配足够的内存,以提高效率。
【2022】贝壳找房秋招C++工程师笔试卷1 牛妹的字符串_第4张图片
【2022】贝壳找房秋招C++工程师笔试卷1 牛妹的字符串_第5张图片
【2022】贝壳找房秋招C++工程师笔试卷1 牛妹的字符串_第6张图片

参考优秀的网友2:

执行k次,循环k次,每次循环里面,找到最小字母的时间赋值,时间赋值度O(n),覆盖的时间复杂度也是O(n), k最大是n,所以总体时间复杂度是O(n^2)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @param k int整型
     * @return string字符串
     */
    string NS_String(string s, int k) {
        // write code here
        for(int i = 1; i<=k; i++) {  总共删除k次
            char min1 = s[0];
            int n = 0;
            while(s[n]!='\0') {  // O(n)
                if(s[n] < min1) {
                    min1 = s[n];
                }
                n++;
            }
            int a, j;
            for(a=j=0; s[a]!='\0'; a++) { //删除一次
                if(s[a] != min1) { //不是要删除的
                    s[j] = s[a];
                    j++;
                }
            }
                s[j] = '\0';
        }
        return s;
    }
};

优秀的网友3:用map

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @param k int整型 
     * @return string字符串
     */
    string NS_String(string s, int k) {
        // write code here
        map<char, int> mymap;
        for(char a:s) {
            ++mymap[a];
        }
        for (int i = 0; i<k; i++) {
            int cnt = mymap.begin()->second;
            char c = mymap.begin()->first;
            while (cnt) {
                s.erase(s.find(c), 1);
                --cnt;
            }
            mymap.erase(c);
        }
        return s;
    }
};

你可能感兴趣的:(C++,c++,开发语言)