首页 新闻 会员 周边 捐助

一道面试题[求解]

0
悬赏园豆:10 [已关闭问题] 关闭于 2010-02-11 09:01

有一个整型数组,里面可能存在相同的元素,请写一个算法,判断里面相同的元素是否超过一半,不要求找出元素的值,和相同的个数,只要求返回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),都是无效的答案.

Jared.Nie的主页 Jared.Nie | 小虾三级 | 园豆:1940
提问于:2010-02-04 09:30
< >
分享
所有回答(5)
0

        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;
        }

Tom-X | 园豆:515 (小虾三级) | 2010-02-04 10:31
这样的时间复杂度最大是O(n);
支持(0) 反对(0) Tom-X | 园豆:515 (小虾三级) | 2010-02-04 10:32
keyValues.ContainsKey(num)的时间复杂度是 keyvalues的大小吧!
支持(0) 反对(0) 杨孔来 | 园豆:262 (菜鸟二级) | 2010-02-04 10:54
0

        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;
        }

这是我写的,期待高手提供更好的。

勤劳的渔网工作者 | 园豆:572 (小虾三级) | 2010-02-04 10:50
时间复杂度超了,,,,
支持(0) 反对(0) 大鹏展翅 | 园豆:210 (菜鸟二级) | 2010-02-04 13:39
很好,用O(n方) 的方式实现了...上学的时候一定很听老师的话...(∩_∩)..
支持(0) 反对(0) Jared.Nie | 园豆:1940 (小虾三级) | 2010-02-04 16:10
0

  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)

杨孔来 | 园豆:262 (菜鸟二级) | 2010-02-04 11:04
谢谢参与,不对,结果都是错的,刚运行过...而且太不灵活了.
支持(0) 反对(0) Jared.Nie | 园豆:1940 (小虾三级) | 2010-02-04 16:08
老兄的想法真是高.很是佩服.这里的答案应该只有老兄的想法是对的.
支持(0) 反对(0) 天天不在 | 园豆:926 (小虾三级) | 2010-02-05 14:16
@林间曦阳: 我想你有时间就看下别人的思路吧.把count > arr1.Length改下count > arr1.Len/2再看看. 如果你认为不灵活.你可能改下就能达到相对灵活的.
支持(0) 反对(0) 天天不在 | 园豆:926 (小虾三级) | 2010-02-05 14:27
0

顶1楼的,,用字典Dictionary

大鹏展翅 | 园豆:210 (菜鸟二级) | 2010-02-04 13:34
@天天不在:用字典Dictionary的ContainsKey方法不能保证一次就得到.散列表也可能出现最差的情况要遍历全部才出结果.
支持(0) 反对(0) 天天不在 | 园豆:926 (小虾三级) | 2010-02-23 14:19
0

三楼的方法非常佩服.

正在学习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());
}

 自己输入看看是否是正确的.


天天不在 | 园豆:926 (小虾三级) | 2010-02-05 16:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册