Cranking the Coding Interview: C1 Array and String

本文介绍了多种字符串处理和矩阵操作的算法实现,包括检查字符串唯一性、字符串翻转、检查排列、URL化、字符串压缩、矩阵置零及旋转等。通过具体代码示例展示了如何高效解决这些常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

is Unique

就是给一个字符串,看是否有重复的字符串。不能使用额外的空间,使用哈希,非常简单。

class Different {
public:
    bool checkDifferent(string iniString) {
        // write code here
        int str_len = iniString.size();
        for(int i = 0; i < str_len; i++) {
            int h = iniString[i]%str_len;
            if(h == i) continue;
            if(iniString[i] == iniString[h]) return false;
            char t = iniString[h];
            iniString[h] = iniString[i];
            iniString[i] = t;
        }
        return true;   
    }
};

String Reverse

字符串翻转,空间复杂度O(1)。

class Reverse {
public:
    string reverseString(string iniString) {
        // write code here
        int s_len = iniString.size();
        for(int i = 0, n = s_len >> 1; i < n; i++) {
            char t = iniString[i];
            iniString[i] = iniString[s_len - 1 - i];
            iniString[s_len - i - 1] = t;
        }
        return iniString;
    }
};

Check Permutation

看一个字符串是否可以由另外一个字符串的随机组合而成。

代码实现:

class Same {
public:
    bool checkSam(string stringA, string stringB) {
        // write code here
        vector<int> hash(53, 0);
        for(int i = 0, lenA = stringA.size(); i < lenA; i++) {
            if(stringA[i] == ' ') hash[52]++;
            else if(stringA[i] >= 'a' && stringA[i] <= 'z') hash[stringA[i]-'a']++;
            else hash[stringA[i] - 'A']++;
        }
        for(int i = 0, n = stringB.size(); i < n; i++) {
            if(stringB[i] == ' ') hash[52]--;
            else if(stringB[i] >= 'a' && stringB[i] <= 'z') hash[stringB[i]-'a']--;
            else hash[stringB[i]-'A']--;
        }
        return !accumulate(hash.begin(), hash.end(), 0);
    }
};

URLify

把截取字符串n位并把空格变”\%20”。

class Replacement {
public:
    string replaceSpace(string iniString, int length) {
        // write code here
        string res;
        for(int i = 0; i < length; i++) {
            if(iniString[i] == ' ') 
                res += "\%20";
            else res += iniString[i];
        }    
        return res;    
    }
};

Zipper

这道题目本来是求一个字符串的压缩。

比如”aaaaaaabbbbaaaa”就是”a7b4a4”。我看错了题目了,然后就是以为计算各个字符出现的次数。

class Zipper {
public:
    string zipString(string iniString) {
        // write code here
        vector<int> hash(52, 0);
        string res;
        int str_len = iniString.size();
        for(int i = 0; i < str_len; i++) { 
            if(iniString[i] >= 'a' && iniString[i] <= 'z') hash[iniString[i]-'a']++;
            else hash[iniString[i]-'A'+26]++;
        }        
        for(int i = 0; i < 26; i++) 
            if(hash[i]) res += (char('a' + i) + to_string(hash[i]));
        for(int i = 26; i < 52; i++) 
            if(hash[i]) res += (char('A' + i - 26) + to_string(hash[i]));
        cout << res << endl;
        return res.size() < str_len?res:iniString;
    }
};

原题解法应该是:

class Zipper {
public:
    string zipString(string iniString) {
        // write code here
        string res;
        int str_len = iniString.size();
        int cnt = 0;
        char tmp;
        for(int i = 0; i < str_len; i++) {
            if(!cnt) {
                tmp = iniString[i];
                cnt++;
            } 
            else {
                if(tmp != iniString[i])  { res += tmp + to_string(cnt); cnt = 1; tmp = iniString[i]; }
                else cnt++;
            }
        }
        res += iniString[str_len-1] + to_string(cnt);
        return res.size() < str_len?res:iniString;
    }
};

zero matrix

若某个元素为0,那么这个元素所在行和列都置为0.

class Clearer {
public:
    vector<vector<int> > clearZero(vector<vector<int> > mat, int n) {
        // write code here
        int m = mat.size();
        if(!m) return mat;
        vector<int> zero(m+n, 0);
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(mat[i][j] == 0) { zero[i] = 1; zero[j+m] = 1; }
            }
        }
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++)
                if(zero[i] || zero[m+j]) mat[i][j] = 0; 
        }
        return mat;
    }
};

这样复杂度很高,在置0的时候判断遍历zero是否大于0来置零,这里就不写了。

*String Rotation

class ReverseEqual {
public:
    bool checkReverseEqual(string s1, string s2) {
        // write code here
        int len1 = s1.size(), len2 = s2.size();
        if(len1 != len2) return false;
        string s3 = s2 + s2;
        string::size_type ind = 0;
        ind = s3.find(s1);
        return ind != string::npos;
    }
};

这里我最开始使用的是find_first_of,但是没法通过测试,后来改成find就可以了。我觉得是和平台有关系,find_first_of应该是没有问题的。

**Rotate Matrix

把一个矩阵顺时针旋转90度,不能有额外的空间。

这里需要主要的是边界条件,以及矩阵的坐标变化。

根据二维矩阵旋转方程,以及数组存储和旋转方程的坐标变换的一个translation,推导出:

f(r) = c

f(c) = n - 1 - r

class Transform {
public:
    vector<vector<int> > transformImage(vector<vector<int> > mat, int n) {
        // write code here
        int half = n >> 1;
        for(int r = 0; r < half; r++) {
            for(int c = r; c < n-r-1; c++) {
                int t1 = mat[n-1-c][r];
                mat[n-1-c][r] = mat[n-1-r][n-1-c];
                mat[n-1-r][n-1-c] = mat[c][n-1-r];
                mat[c][n-1-r] = mat[r][c];     
                mat[r][c] = t1;
            }
        }
        return mat;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值