刚才无意间看到一个数学题目,六位数能被9整除,且各个数字不相同,求最大的六位数减最小六位的数。看到这种题目我想都没想就直接打开了vs,中途遇到了一个问题就是不能有重复的数字,我就用itoa函数将数字转换成字符串然后再判断:
bool Check_2(char* str)
{
if (*str == 0) return false;
for (char* p = str; *p != 0; p++)
{
for (char* q = p + 1; *q != 0; q++)
{
if (*p == *q)
{
return true;
}
}
}
return false;
}
但是显然这种判断的方法不够简单,复杂度为O(n^2),我又去网上搜了一下,发现了有其他的方法。
此类题目追求的所谓最优解是复杂度越低越好,这个方法效率很高,O(n),空间换时间,需要辅助空间。思路是,开辟一个具有256个元素的整型数组,为什么是256个元素呢,因为ASCII字符一共256个(从0开始,前128个为常用的字符,如运算符、字母、数字等键盘上可以显示的,后128个为特殊字符,是键盘上找不到的字符)。这个数组的index就是字符的ASCII码,值就是该元素出现的次数。
bool RepeatChar_1(char* str)
{
if (*str == 0) return false;
int num[256] = {0};
char *p = str;
while(*p !=0)
{
if (num[*p] >=1)
{
return true;
}
num[*p]++;
p++;
}
return false;
}