昨天在 陈跃峰的blog上看到《两个基础的算法题目》的文章,今天下午抽空做了一下感觉有点意思,下面是我的答案,欢迎大家拍砖。
1、 编写方法,生成符合如下要求的一个一维数组。
要求如下:
1) 该数组的长度是20(2分)
2) 其中包含2组1-10之间的所有整数(5分)
3) 每个元素的位置不固定,也就是随机数组(8分)
4) 该方法的返回值为该一维数组(2分)
5) 代码规范(3分)
2、 编写方法,返回一个整数中出现次数最多的数字,如果出现的次数相同,则返回相同次数中数字最大的。例如12121返回1,133221返回3,9返回9
要求如下:
1) 方法声明(2分)
2) 计算出现次数(5分)
3) 返回正确的数字(10分)
4) 代码规范(3分)
第一个问题解决思路:要求“数组中包含2组1-10之间的所有整数并且每个元素的位置不固定“这是这个问题最难的部分
,解决这个问题,我想到了两种方法:一是按数组顺序从0到19填充一个1到10之间随机生成的整数,这种方法很难控制生成的
随机数不重复多次;二是1到10之间的数按顺序产生但随机填充到数组中,通过判断数组是否被填充过,就可以保证10个被完全填充。
int * generatArray()
{
int * intArray=new int[20];
memset(intArray,0,20); //初时化数组
for(int j=0;j<2;j++)
for(int i=1;i<=10;)
{
random=random(20);
if(0==intArray[random]) intArray[random]=i++;
}
return intArray;
}
第二个问题解决思路:刚看到这个题目觉得可能有两种解决思路,其一是讲这个整型转换成字符型,判断每个字符
的ASCII码或直接比较是否相等来找到重复最多的字符,然后在将这个字符转换成整型返回。其二是按位分离整型数据的
每一位,判断哪一个数字重复的最多。我这里用的是第二个思路,分离数字是采用的方法是除以位基然后做差的方法。比如说分离
个位,首先见整型数据处以10后得到去掉个位的整型数据再将这个数据乘以10,然后与原来的数据做差就得到了个位的数字。
int countNumber(unsigned int intOrign)
{
int intCount[10]={0}; //记录每个数字出显的次数
int n=0; //记录给定整型的位数
while(!(intOrign/pow(10,n))) n++; //确定整型的位数
for(int i=0;i<n;i++) //分离每一位的数字
{
int bit=( pow(10,i)*(intOrign/pow(10,i)-pow(10,i+1)*(intOrign/pow(10,i+1) )/pow(10,i);
intCount[bit]+=1;//在相应的数字上加1;
}
int max=0;
for(int i=0;i<10;i++) //确定哪个数字出先的最多
{
max=(intCount[i]<=intCount[i+1])? (i+1):i;
}
return max;
}
按位分离一个数是有更好的方法的,我上面讲的是一中拙略的方法,将数n与10求余就可以很好的分离。