数组a[N],1至N-1这N-1个数存放在a[N]中,其中某个数重复一次,写一个函数,找出被重复的数字。要求每个数组元素只能访问一次,不用辅助存储空间。由于题目要求每个数组元素只能访问一次,不用辅助存储空间,可以从原理上入手,采用数学求和法,因为只有一个数字重复一次,而数又是连续的,根据累加和原理,对数组的所有项求和,然后减去1至N-1的和,即为所求的重复数。程序代码如下:#include "stdafx.h"#include void xor_findDup(int *a, int N){ int tmp1 = 0; int tmp2 = 0; for (int i = Read More
posted @ 2014-03-07 22:27 源子陌 Views(6072) Comments(1) Diggs(0) Edit
方法一:每次取出两个不同的数,剩下的数字中重复出现次数超过一半的数字肯定,将规模缩小化。如果每次删除两个不同的数,这里当然不是真的把它们踢出数组,而是对于候选数来说,出现次数减一,对于其他数来说,循环遍历就行。在剩余的数字里,原最高频数出现的频率一样超过了50%,不断重复这个过程,最后剩下的将全是同样的数字,即最高频数。此算法避免了排序,时间复杂度只有O(n).程序示例如下:#include "stdafx.h"#include int FindMostApperse(int* num, int len){ int candidate = 0; int count = 0; Read More
posted @ 2014-03-07 21:02 源子陌 Views(1144) Comments(0) Diggs(0) Edit
方法一:以空间换时间,可以定义一个数组intcount[MAX],并将其数组元素都初始化为0,然后执行for(inti=0;iindex) { index = arr[i]; num = i; } //printf("%d\n", num); } return index;}int main(){ int array[] = { 1, 1, 2, 2, 4, 4, 4, 4, 5, 5, 6,6 }; int length = sizeof(array) / sizeof(array[0]); int i; int num = 0; int* count = new int Read More
posted @ 2014-03-07 10:20 源子陌 Views(15183) Comments(0) Diggs(0) Edit