有一个整型数组,里面可能存在相同的元素,请写一个算法,判断里面相同的元素是否超过一半,不要求找出元素的值,和相同的个数,只要求返回true or false,例如:
{1,2,3,1,5,1,8,9,1,5,1,1,1}=true
{3,2,1,6,7,9,7,6,1,3}=false
要求时间复杂度是 O(n)
注意时间复杂度,超过O(n),都是无效的答案.
private bool CheckArray(int[] arr)
{
//存储数组中出现的数字以及数字出现的次数
Dictionary<int, int> keyValues = new Dictionary<int, int>();
foreach (int num in arr)
{
//数字非第一次出现时,在数字出现次数上加1
if (keyValues.ContainsKey(num))
{
keyValues[num] = keyValues[num] + 1;
//当数字出现次数大于数组一半时返回True
if (keyValues[num] > arr.Length / 2)
return true;
}
else//数字第一次出现时添加到数组中
{
keyValues.Add(num, 1);
}
}
return false;
}
private bool ResultFalseOrTrue()
{
int[] NumberA = new int[] { 3, 2, 1, 6, 7, 9, 7, 6, 1, 3, 1, 2, 3, 1, 5, 1, 8, 9, 1, 5, 1, 1, 1, 1, 2, 3, 1, 5, 1, 8, 9, 1, 5, 1, 1, 1, 1, 2, 3, 1, 5, 1, 8, 9, 1, 5, 1, 1, 1, 1, 2, 3, 1, 5, 1, 8, 9, 1, 5, 1, 1, 1, 1, 2, 3, 1, 5, 1, 8, 9, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
for (int i = 0; i < NumberA.Length; i++)
{
int count = 1;
for (int j = 0; j < NumberA.Length; j++)
{
if (i != j)
{
if (NumberA[i] == NumberA[j])
{
count++;
}
}
}
if (count > NumberA.Length / 2)
{
return true;
}
}
return false;
}
这是我写的,期待高手提供更好的。
public class CalNum
{
public int[] a;
public int[] arr1 = new int[] { 1, 2, 3, 1, 5, 1, 8, 9, 1, 5, 1, 1, 1 };
public int[] arr2 = new int[] { 3, 2, 1, 6, 7, 9, 7, 6, 1, 3 };
public bool Test(int [] arr1)
{
a = new int[100];
for (int i = 0; i < 100; i++) a[i] = 0;
foreach (int v in arr1)
a[v] += 1;
int count = 0;
for (int i = 0; i < 100; i++)
if (a[i] > 1) count += a[i] - 1;
return count > arr1.Length;
}
public void fun()
{
Console.WriteLine(Test(arr1));
Console.WriteLine(Test(arr2));
}
}
时间复杂度是O(n)
顶1楼的,,用字典Dictionary
三楼的方法非常佩服.
正在学习JavaScript,用JavaScript把这个方法改写下.只要整形数组里没有值大于100,就没问题.
其实把数组定的范围越大.数组里允许的值就可以越大.对上面的一题.最大值取10就OK.
function check()
{
var myarray = new Array();
for(var i =0 ;i<100;i++)
myarray[i] = 0;
var text = $('#Text2').val();
var intarray = text.split(",");
$(intarray).each(function(){
myarray[this] += 1;
// alert(myarray[this]);
});
var count = 0;
for(var i =0;i< 100;i++){
if(myarray[i]>1){
count += myarray[i] -1;
}
}
alert('重复数为:'+ count.toString() + '\n'+'结果:'+ (count*2 >= intarray.length).toString()); }
自己输入看看是否是正确的.