风扫地 发表于 2019-6-15 10:09:24

136_只出现一次的数字

/*
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入:
输出: 1
示例 2:
输入:
输出: 4
*/

int singleNumber(int* nums, int numsSize){
   
    int ret_val = 0;
    int i = 0;
   
    for(i = 0; i <numsSize;i++)
    {
      ret_val ^= nums;
    }
    return ret_val;

}



/*
最近提交结果:
通过
显示详情
执行用时 :12 ms, 在所有C提交中击败了99.46% 的用户
内存消耗 :7.9 MB, 在所有C提交中击败了40.52%的用户


16 / 16 个通过测试用例 状态:通过
执行用时:12 ms
提交时间:0 分钟之前

*/

风扫地 发表于 2019-6-15 10:11:08

利用异或特性~

Seawolf 发表于 2019-6-15 10:56:50

看不懂你说的异或怎么在你的code里体现,能解释一下吗,我用python写了一个,runtime:60ms


class Solution:
    def singleNumber(self, L):
      head = self.get_head(L)
      tail = self.get_tail(L)
      if head in tail:
            L1 = self.delete(head,tail)
            self.singleNumber(L1)
      else:
            print(head)
      
    def get_head(self,L):
      if len(L) >= 1:
            return L
      else:
            return []

    def get_tail(self,L):
      if len(L) >= 1:
            return L
      else:
            return []

    def delete(self,X, L):
      if L == []:
            return []
      else:
            if X == self.get_head(L):
                return self.delete(X, self.get_tail(L))
            else:
                return + self.delete(X, self.get_tail(L))

风扫地 发表于 2019-6-15 15:25:57

本帖最后由 风扫地 于 2019-6-15 17:54 编辑

Seawolf 发表于 2019-6-15 10:56
看不懂你说的异或怎么在你的code里体现,能解释一下吗,我用python写了一个,runtime:60ms

a ^ a = 0;
0 ^ b = b;
a ^ b ^ c = a ^ (b ^ c);
a ^ b ^ c = a ^ c ^ b;

异或操作满足结合律和交换律。
在本题中,出现偶数次的数在异或操作后会变成0,出现奇数次的数会最后剩下来。
页: [1]
查看完整版本: 136_只出现一次的数字