60天力扣打卡(第一天)

我今天要开启一个新系列,那就是60天力扣打卡。今天我要打卡的是题号为136的小题。

136. 只出现一次的数字

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

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

示例 1 :

输入:nums = [2,2,1]
输出:1

示例 2 :

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

示例 3 :

输入:nums = [1]
输出:1

提示:

  • 1 <= nums.length <= 3 * 104
  • -3 * 104 <= nums[i] <= 3 * 104
  • 除了某个元素只出现一次以外,其余每个元素均出现两次。

我们面对此题,有两种思路。

思路一:

用两次循环遍历数组,第一层循环遍历数组是为了指定一个元素,用count代表这个指定元素的个数,第二层循环遍历数组是为了寻找指定元素在此数组中的个数,如果个数大于一不用返回指语言定元素,个数等于1,需要返回指定元素。下面是我用C语言写的代码,我的实力不足,请供参考。

int singleNumber(int * nums,int numsSize)
{
       for(int i=0;i

思路二:

我们在离散数学中学过位运算,位运算是基于bit位上的运算。最常用的位运算有:与&,或|,异或^。假设A与B是bit位上的数,那门A,B的取值为0或1。假设A取0,B取0,那么A|B=0,A&B=0,A^B=0;假设A取1,B取0,那么A|B=1,A&B=0,A^B=1;假设A取0,B取1,那么A|B=1,A&B=0,A^B=1;假设A取1,B取1,那么A|B=1,A&B=1,A^B=0。故我们可以推出,当A与B是一个int类型的数据,并且A与B不是同一个数字,那么A^A=B^B=0,A^B=B^A,假设A=0,那么A^B=B。我i们第二个思路是根据这个来的。C代码请供参考。

 

int singleNumber(int *nums,int numsSize)
{ 
         int n=*(nums+0);
         for(int i=1;i

 我现在用1个例子给大家演示。

示例 :

输入:nums = [2,2,1]
输出:1

假设nums = [2,2,1],那么n=*(nums+0)=nums[0]=2,当i为1时,n=n^nums[i]=n^nums[1]=2^2=0;

当i为2时,n=n^nums[i]=n^nums[2]=0^1=1。于是当输入为[2,2,1]时,输出为1。

你可能感兴趣的:(leetcode,算法,c语言)