现在的位置: 首页 > 综合 > 正文

陈跃峰的《两个基础的算法题目》的解答

2013年08月29日 ⁄ 综合 ⁄ 共 1403字 ⁄ 字号 评论关闭

    昨天在 陈跃峰的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求余就可以很好的分离。

 

抱歉!评论已关闭.