leetcod刷题---只出现一次的数字

吐槽

今天刷了两道题,但是第一道太简单了就不记录了,来看下这块坑了我10分钟的题233

题目

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

说明:

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

示例 1:

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

示例 2:

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

思路

我自己的解题思路:
看了下题,发现这块很简单哇,先给数组排个序,然后单独重新的数放置有三种情况讨论下

  • 在数组第一个位置
  • 在数组最后一个位置
  • 在数组的中间

第一种和第二种情况,直接就判断下,看下它的后面和前面是否值相等,不相等的时候,就是它了

第三种情况也很好判断,因为先是排好序,所以两个一样的肯定在一起233,所以判断下这个数和前面的数一样不而且再看下和后面的数一样不,如果都不一样,那就是这个单身狗了就找到了

//这道题有毒的地方是,测试数据数组可能只有一个233
我的答案能过,但是发现费时太多233,不是优秀的解法

public int singleNumber(int[] nums) {
    int n = 0;
    int k = nums.length;
    if (k == 1){
        return nums[0];
    }
    Arrays.sort(nums);
    if (nums[0] != nums[1]){
        n = nums[0];
    }
    if (nums[k-1] != nums[k-2]){
        n = nums[k-1];
    }
   if (k > 3){
       for (int i = 2;i < k-2;i++){
           if ((nums[i] != nums[i+1])&&(nums[i] != nums[i-1])){
               n = nums[i];
               break;
           }
       }
   }
    return n;
}

代码

真正这道题要考的是异或运算

根据异或运算的特点,相同的数字经过异或运算后结果为0,除单独出现一次的数字外,其他数字都是出现两次的,那么这些数字经过异或运算后结果一定是0。而任何数字与0进行异或运算都是该数字本身。所以对数组所有元素进行异或运算,运算结果就是题目的答案

public static int singleNumber(int[] nums) {
         int num = 0;
        for (int i = 0; i < nums.length; i++) {
             num = num ^ nums[i];
        }
        return num;
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值