数组中数字出现的次数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组中数字出现的次数相关的知识,希望对你有一定的参考价值。

参考技术A 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

示例 1:

输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
示例 2:

输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]

限制:

举例:2,4,3,6,3,2,5,5

这个数组中只出现一次的两个数分别是4和6。怎么找到这个两个数字呢?

我们先不看找到俩个的情况,先看这样一个问题,如何在一个数组中找到一个只出现一次的数字呢?比如数组:4,5,5,唯一一个只出现一次的数字是4。

我们知道异或的一个性质是:任何一个数字异或它自己都等于0。也就是说,如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现一次的数字。比如数组4,5,5,我们先用数组中的第一个元素4(二进制形式:0100)和数组中的第二个元素5(二进制形式:0101)进行异或操作,0100和0101异或得到0001,用这个得到的元素与数组中的三个元素5(二进制形式:0101)进行异或操作,0001和0101异或得到0100,正好是结果数字4。这是因为数组中相同的元素异或是为0的,因此就只剩下那个不成对的孤苦伶仃元素。

现在好了,我们已经知道了如何找到一个数组中找到一个只出现一次的数字,那么我们如何在一个数组中找到两个只出现一次的数字呢?如果,我们可以将原始数组分成两个子数组,使得每个子数组包含一个只出现一次的数字,而其他数字都成对出现。这样,我们就可以用上述方法找到那个孤苦伶仃的元素。

我们还是从头到尾一次异或数组中的每一个数字,那么最终得到的结果就是两个只出现一次的数组的异或结果。因为其他数字都出现了两次,在异或中全部抵消了。由于两个数字肯定不一样,那么异或的结果肯定不为0,也就是说这个结果数组的二进制表示至少有一个位为1。我们在结果数组中找到第一个为1的位的位置,记为第n位。现在我们以第n位是不是1为标准把元数组中的数字分成两个子数组,第一个子数组中每个数字的第n位都是1,而第二个子数组中每个数字的第n位都是0。

举例:2,4,3,6,3,2,5,5

我们依次对数组中的每个数字做异或运行之后,得到的结果用二进制表示是0010。异或得到结果中的倒数第二位是1,于是我们根据数字的倒数第二位是不是1分为两个子数组。第一个子数组2,3,6,3,2中所有数字的倒数第二位都是1,而第二个子数组4,5,5中所有数字的倒数第二位都是0。接下来只要分别两个子数组求异或,就能找到第一个子数组中只出现一次的数字是6,而第二个子数组中只出现一次的数字是

如何求出数组中出现次数最多的数字(C#实现)

/// <summary>
/// 求出数组中出现次数最多的数字
/// </summary>
public class MaxCounter

/// <summary>
/// numbers:要统计的数组,count:统计最多资料
/// 返回出现次数最多的数字
/// </summary>
public int GetMaxCounts(int[] numbers, out int count)

Hashtable _hash = new Hashtable();

int max = 0; //出现次数
int num = 0; //数字
foreach (int i in numbers)

if (_hash.ContainsKey(i))

int v = (int)_hash[i];
_hash[i] = v+1;

else
_hash.Add(i, 1);

int tmp = (int)_hash[i];

if (tmp > max)

max = tmp;
num = i;


count = (int)_hash[num];//统计次数

return num; //返回出现最多次数的数



================
调试:

int[] test = new int[] 1, 1, 2, 2, 2, 2, 2, 3, 4, 55, 66 ;
int count = 0;
int max = new MaxCounter().GetMaxCounts(test, out count);
参考技术A 已经测试过的:

int[] A = new int[9] 1, 5, 2, 1, 2, 6, 5, 2, 5 ;
int[] B = new int[A.Length]; //记录每个数字重复的次数
int[] max = new int[A.Length]; //记录出现次数最大的数,如果有多个,都列出来(比如2和5都出现了最多次--3次)

//将每个数字出现的次数计入B[]
for (int i = 0; i < A.Length; i++)

int m = 0;
for (int j = 0; j < A.Length; j++)

if (i != j)

if (A[i] == A[j])

m++;



B[i] = m;

//获取出现最多的次数
int n = 0;
for (int k = 0; k < B.Length - 1; k++)

if (B[k] >= B[k + 1])

B[k + 1] = B[k];

n = B[k + 1];

//找出最大数存入max[]
for (int i = 0; i < A.Length; i++)

int m = 0;
for (int j = 0; j < A.Length; j++)

if (i != j)

if (A[i] == A[j])

if (i < j)

m++;




if (m == n)

max[i] = A[i];
//将结果以弹出窗口的形式逐个输出
ClientScript.RegisterStartupScript(GetType(), "" + i, "<script>alert('" + max[i] + "')</script>");

参考技术B 代码在txt文档中编写,有错误处自行修改下。

int num = new int[]1,2,3,1;
int num2 = new int[num.length];

int b = 0;

for(int i = 0; i < num.length;i++)

int a = 0;
for(int j = 0; j < num.length;j++)

if(num[i] == num[j])

a++;


num2[i] = a;


for(int i = 0; i < num.length;i++)

for(int j = 0; j < num.length;j++)

if(num[i] < num[j])

c = num[j];




messageboxs.show("数组中最大的是" + c)本回答被提问者采纳
参考技术C int num = new int[]1,2,3,1;
int num2 = new int[num.length];

int b = 0;

for(int i = 0; i < num.length;i++)

int a = 0;
for(int j = 0; j < num.length;j++)

if(num[i] == num[j])

a++;


num2[i] = a;


for(int i = 0; i < num2.length;i++)

for(int j = 0; j < num2.length;j++)

if(num2[i] < num2[j])

c = num2[j];




messageboxs.show("数组中最大的是" + c)

就是两个嵌套for循环么
参考技术D 这种题目用linq更好些,虽然我还没有开始接触linq,但是我按着示例给你写了一个,不要忘记引入using System.Linq:
int maxCountNum=(
from num in new[] 1, 12, 12, 21, 12, 4, 4, 5
group num by num into g
orderby g.Count() descending
select g.Key
)
.First();
Console.WriteLine(maxCountNum);

以上是关于数组中数字出现的次数的主要内容,如果未能解决你的问题,请参考以下文章

数组中次数超过数组长度一半的数字

数组中数字出现的次数

数组中出现次数超过一半的数字-剑指Offer

剑指offer-数组中出现次数超过一半的数字

数组中出现次数超过一半的数字

出现次数超过一半的数字