代码改变世界

算法题:int 数组中 只有一个是id 只出现一次 其他都出现2次 怎么找出只出现一次的id

2019-03-15 10:35  会飞的雪鹿  阅读(258)  评论(0编辑  收藏  举报

首先讲一个最笨的算法:时间复杂度为N  空间复杂度为N

代码如下:输出结果id=3完全正确;    

            int[] a = new int[] { 1, 1, 2, 2, 3, 4, 4 };
            Dictionary<int, int> dic = new Dictionary<int, int>() { };
             for (int i = 0; i < a.Length; i++)
            {
                if(dic.Keys.Contains(a[i]))
                {
                    dic[a[i]]++;
                }
                else
                {
                    dic.Add(a[i], 1);
                }
            }
            int id=dic.FirstOrDefault(s => s.Value == 1).Key;         
       

  再来一种时间复杂度为N 空间复杂度为1的。

            List<int> arr = new List<int> { 1, 1, 2, 2, 3, 4, 4 };
            List<int> arrnew = new List<int>();
            for (int i = 0; i < arr.Count; i++)
            {
                if(arrnew.Contains(arr[i]))
                {
                    arrnew.Remove(arr[i]);
                }
                else
                {
                    arrnew.Add(arr[i]);
                }
            }

             id = arrnew[0];    

  

再来个最佳算法:异或来做。(0异或任何数都为本身,相等的数异或为0,异或支持结合律)

            int[] arr = new int[] {1,1,2,2,3,4,4 };
            var m=0;
            for(int i=0;i<arr.Length;i++)
            {
                m = m ^ arr[i];
            }

  m=3;

完美解决问题