Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2877427
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-09-03 21:34:58

找出绝对值最小的元素

给定一个有序整数序列(非递减序),可能包含负数,找出其中绝对值最小的元素,比如给定序列 -5, -3, -1, 2, 8 则返回1。

分析

找出绝对值最小的元素:直接二分查找0该插入的位置,则要找的数就在插入位置本身,或者左边或右边。



点击(此处)折叠或打开

  1. #include
  2. #include
  3. #define N 15
  4. int B[N];

  5. int minabs(int B[],int n)
  6. {
  7.     int i=0;
  8.     int min;
  9.     if(n==1)
  10.         return B[0];
  11.     for(i=0;i
  12.     {
  13.         if(B[i]>0)
  14.             break;
  15.     }
  16.     if(i==0)//所有都是正数
  17.         min=B[0];
  18.     else if(i==n)//所有都是负数
  19.         min=B[n-1];
  20.     else
  21.         min=abs(B[i-1])
  22.     return min;
  23. }
  24. int main()
  25. {
  26.     for(int i=0;i
  27.     {
  28.         scanf("%d",&B[i]);
  29.     }
  30.     int min=minabs(B,N);
  31.      printf("the minabs of array %d\n",min);
  32.     return 0;
  33. }
  34. /*
  35. 1 4 5 7 9 11 13 16 19 20 24 26 27 28 29
  36. the minabs of array 1
  37. Press any key to continue

  38. -29 -28 -27 1 4 5 7 9 11 13 16 19 20 24 26
  39. the minabs of array 1
  40. Press any key to continue

  41. */


求数组中出现次数超过一半的元素

给定一个n个整型元素的数组a,其中有一个元素出现次数超过n / 2,求这个元素。据说是百度的一道题

分析

设置一个当前值和当前值的计数器,初始化当前值为数组首元素,计数器值为1,然后从第二个元素开始遍历整个数组,对于每个被遍历到的值a[i]

1 如果a[i]==currentValue,则计数器值加1

2 如果a[i] != currentValue, 则计数器值减1,如果计数器值小于0,则更新当前值为a[i],并将计数器值重置为1

代码

点击(此处)折叠或打开

  1. // 找出数组中出现次数超过一半的元素
  2. int Find(int* a, int n)
  3. {
  4.     int curValue = a[0] ;
  5.     int count = 1 ;

  6.     for (int i = 1; i < n; ++i)
  7.     {
  8.         if (a[i] == curValue)
  9.             count++ ;
  10.         else
  11.         {
  12.             count-- ;
  13.             if (count < 0)
  14.             {
  15.                 curValue = a[i] ;
  16.                 count = 1 ;
  17.             }
  18.         }
  19.     }

  20.     return curValue ;
  21. }
另一个方法是先对数组排序,然后取中间元素即可,因为如果某个元素的个数超过一半,那么数组排序后该元素必定占据数组的中间位置 











阅读(896) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~