n个[0,n)的数,求每个数的出现次数(不能开辟额外空间)

问题:

问题:n个[0,n)的数,求每个数的出现次数(不能开辟额外空间)

如:
n个[0,n)的数,求每个数的出现次数(不能开辟额外空间)_第1张图片
在不占用额外空间的情况下,求出每个数字出现的次数。

解答:

分析得:

  • n 个不超过 n 的数字,可以利用取模和除数来思考
  • 可以遍历所有数据,然后在每个数据作为下标的位置处加上一个 n ,此时:
  • 每个位置的数据取余 n 就是其原始数据
  • 每个位置的数据除以 n 就是其出现次数

如:
n个[0,n)的数,求每个数的出现次数(不能开辟额外空间)_第2张图片
代码:

#include 

int main(int argc, char const *argv[])
{
	int array[] = {1, 2, 1, 4, 1};
	int n = sizeof(array) / sizeof(array[0]);
	int i = 0;
	for(i = 0; i < n; i++){
		array[array[i] % n] += n;
	}
	for(i = 0; i < n; i++){
		printf("%d:%d次\n", i, array[i] / n);
	}
	return 0;
}

你可能感兴趣的:(算法)