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