基于前面对ASCLL码的理解,对应的练习题
一. 判定字符是否唯一
题目链接:
面试题 01.01. 判定字符是否唯一
这道题我们只需用数组统计每个字母的出现次数,找出只出现过一次的字母即可。
代码如下:
bool isUnique(char* astr){
int Hash[26] = { 0 };
int n = strlen(astr);
for(int i = 0; i < n; i++){
if(astr[i] >= 'a'){
Hash[astr[i]- 'a']++;
}
else{
Hash[astr[i]- 'A']++;
}
}
for(int i = 0; i < 26; i++){
if(Hash[i] > 1){
return false;
}
}
return true;
}
这种写法可以过力扣上的全部例子,但是有一种特殊情况不行
所以正确的写法应该如下:
bool isUnique(char* astr){
int Hash[256] = { 0 };
int n = strlen(astr);
for(int i = 0; i < n; i++){
Hash[astr[i]]++;
}
for(int i = 0; i < 256; i++){
if(Hash[i] > 1){
return false;
}
}
return true;
}
二. 第一个只出现一次的字符
题目链接:
剑指 Offer 50. 第一个只出现一次的字符
思路分析:
由于我们字符串中只有小写字母,所以我们只需考虑小写的情况即可。
代码如下:
char firstUniqChar(char* s){
int Hash[26] = { 0 };
int n = strlen(s);
for(int i = 0; i < n; i++){
Hash[s[i] - 'a']++;
}
for(int i = 0; i < n; i++){
if(Hash[s[i] - 'a'] == 1){
return s[i];
}
}
return ' ';
}
三. 赎金信
题目链接:
383. 赎金信
思路分析:
这道题其实就是让我们判断是否能用magazine中的字符来表示ransomNota中的字符,所以我们只需要统计两个字符串中的字符类型与个数,然后进行比较,如果ransomNota中有的magazine中都有,则返回true;
代码如下:
bool canConstruct(char * ransomNote, char * magazine){
int n1 = strlen(ransomNote);
int n2 = strlen(magazine);
int arr1[26] = { 0 };
int arr2[26] = { 0 };
for (int i = 0; i < n1; i++){
arr1[ransomNote[i] - 'a']++;
}
for (int i = 0; i < n2; i++){
arr2[magazine[i] - 'a']++;
}
for (int i = 0; i < 26; i++){
if (arr2[i] < arr1[i]){
return false;
}
}
return true;
}