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

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-08-31 15:31:07

1.找出数组中唯一的重复元素

问题描述:给定包含101个元素的数组arr,数组中元素一定属于[1,100],并且[1,100]之间的每个数都在arr中出现过。

解决方案:分析,数组中有101个元素,如果[1,100]之间的每个数出现一次,那就是100个元素了,剩下的那个元素就是唯一的重复出现的元素。我们可以通过遍历arr,得到arr中所有元素的总和,然后既然[1,100]之间的每个数出现一次,那么我们减去1+2+……+99+100的和,结果就是我们需要的唯一的重复出现的元素了。时间复杂度是O(n)。

点击(此处)折叠或打开

  1. #include
  2. #define N 100

  3. int array[101];
  4. int findOnlyRepeat(int * a)
  5. {
  6.     int total_sum=0,sub_sum=0;
  7.     for(int i=1;i<=N;i++)
  8.     {
  9.         sub_sum+=i;
  10.         total_sum+=a[i-1];
  11.     }
  12.     return (total_sum+a[N]-sub_sum);
  13. }
  14. int main()
  15. {
  16.     //初始化数组,元素必定是1,...,100
  17.     for(int i=1;i<=N;i++)
  18.     {
  19.         array[i-1]=i;
  20.     }
  21.     array[N]=90;//随便置一个数重复,就算是其它下标也行啊,只是测试

  22.     int repeat=findOnlyRepeat(array);
  23.     printf("the reapeat is %d\n",repeat);
  24.     return 0;
  25. }

2.找出数组中出现奇数次的元素

问题描述:现在有一个整数数组arr,其中的元素只有一个元素出现奇数次,请找出这个元素。

解决方案:对于任意一个数k,有k^k = 0,k^0 = k,所以将arr中所有元素进行异或,那么出现次数为偶数的元素异或后都变成了0,出现次数为奇数的元素异或后得到元素本身。下面写代码就很容易了~~时间复杂度是O(n)。


点击(此处)折叠或打开

  1. #include

  2. //找出数组唯一的出现次数是奇数的元素,不能找出所有,
  3. //用hash吧
  4. int findTheOdd(int * a,int n)
  5. {
  6.     int ans=a[0];
  7.     for(int i=1;i
  8.     {
  9.         ans^=a[i];
  10.     }
  11.     return ans;
  12. }
  13. int main()
  14. {
  15.     int a[13]={1,1,1,2,2,2,2,3,3,5,5,6,6};
  16.     int odd=findTheOdd(a,13);
  17.     printf("the number of odd is %d\n",odd);
  18.     return 0;

  19. }

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