本人小白,编写一个函数,接收一个指向字符串的指针作为参数,返回字符串中重复字符的数目。例如在“Mississippi”中存在三个重复字符,不分大小写,重复次数大于等于2作为一次重复,只统计一次。如“mppp”只有一个重复字符。假定函数原型为:
int repeat(*ptr)
希望有大神能给予回答。
http://www.cnblogs.com/xh0102/p/5664234.html
https://wenku.baidu.com/view/06e4546f7e21af45b307a8ae.html
使用hash的一个比较弱的方案,如下:
#include
using namespace std;
int repeat(char *ptr);
int main()
{
char *pstr = "TESTaaTEST";
std::cout << repeat(pstr);
return 0;
}
/*
特别注意:本方法仅能完成A-Z、a-z区间内任意字符形成的字符串查重
*/
int repeat(char *ptr)
{
int iRet = 0;
if (!ptr)
{
return iRet;
}
int iAryStat[26] = {0};
char *ptrTmp = ptr;
int iTmp = -1;
while (*ptrTmp != '\0')
{
if (*ptrTmp >=65 && *ptrTmp <= 90)
{
iTmp = *ptrTmp - 65;
iAryStat[iTmp]++;
ptrTmp++;
continue;
}
if (*ptrTmp >= 97 && *ptrTmp <= 122)
{
iTmp = *ptrTmp - 97;
iAryStat[iTmp]++;
ptrTmp++;
}
}
for (int i = 0; i < 26; i++)
{
if (iAryStat[i] > 1)
{
iRet++;
}
}
return iRet;
}
int repeat(char *ptr)
{
int hash[26]={0};//哈希表,每个元素表示对应字母出现的个数
char *p=ptr;
while(*p!='\0')
{
if(*p>='a') //这里只考虑了字符是大小写,没有考虑字符不是字母的情况
hash[*p-'a']++;
else hash[*p-'A']++;
p++;
}
int count=0;
for(int i = 0; i<26; i++)
{
if(hash[i]>1) // 对应的字母出现个数大于一
count++;
}
return count;
}