最近看到一道简单的算法问题,刚好有点小空,尝试一下,看下新学的C/C++能不能实现。
题目1:
给定一个字符串和一个字串,需要找出字串出现的个数 例如:“hahahahahhahhha”,找出有多少个”ha“
这个问题就纯粹是C的字符的考察和指针的移动了。
- 首先我们通过strstr方法找到第一个出现‘ha’的位置以及后续的字符串,将它赋值为指针p
char *p = strstr(str, sub_str);
- 移动指针P字串的长度,直到指针p为空,就结束,每成功移动一次,更新一次计数count,最终输出count即可
count++;
p+= strlen(sub_str);
p = strstr(p, sub_str);
整体代码如下:
int str_count(char *str, char *sub_str){
int count = 0;
char *p = strstr(str, sub_str);
while(p != NULL){
count++;
p+= strlen(sub_str);
p = strstr(p, sub_str);
}
return count;
}
题目2:
给定一个字符串,我们求出字符串的非空字符的长度
例如:"ha hhhhhha haha hhhhhha" 这个题也适合上面的做法,我们把“ ”当作sub_str,然后获取count,再用strlen-count就是非空字符长度。 当然,这一次我们换种做法,我们通过指针的移动来做,如果遇到" ",计数不变,否则+1的方式,指针移动结束,长度也就出来了。
int str_len(char *str){
int count = 0;
char *p = str;
while(*p){
if(*p != ' '){
count++;
}
p++;
}
return count;
}
题目3
给定两个字符串,判断字符串是否相等
这应该是很多地方都见过的一个基础问题,这次我们通过指针的移动方式来判断一下 例如:“ha1haha”,“hahaha”判断这两个字符串是否相等 解题思路: 1.我们把两个字符串赋值给两个指针,指针同时向前移动一个单位,如果指针不相等了,那么直接返回。
int flag = 0;
char *p = str1;
char *q = str2;
while(*p || *q){
if(*p == *q){
p++;
q++;
flag = 1;
} else {
return 0;
}
}
2.如果一个指针已经移动到了最后的位置,另外一个还没有结束,这个也代表不相等,也可以直接返回结果
if(p == NULL || q == NULL){
return 0;
}
3.如果这两个条件都符合,那么两个字符串确实相等 整体代码如下:
int str_compare(char *str1, char *str2){
int flag = 0;
char *p = str1;
char *q = str2;
while(*p || *q){
if(p == NULL || q == NULL){
return 0;
}
if(*p == *q){
p++;
q++;
flag = 1;
} else {
return 0;
}
}
return flag;
}