136 Single Number 找到只出现一次的数

来源:互联网 发布:域名对应的ip地址 编辑:程序博客网 时间:2024/06/02 07:30

题目:给定一个数组,其中只有一个数出现一次,其余都出现两次,请在O(n)的时间内,不另外开辟内存,找到这个只出现一次的数。、
解答:每个数与自己进行异或,结果是0,0与任何数异或,还是这个数。因此将所有数取异或,结果就是只出现一次的数。

class Solution {public:    int singleNumber(vector<int>& nums) {        int result=0;        for(int i=0;i<nums.size();i++)        {            result=result^nums.at(i);        }        return result;    }};

拓展:
1.一个数组中有两个元素只出现一次,其他所有元素都出现两次,求这两个只出现一次的元素

[解题思路]
将数组所有元素都进行异或得到一个不为0的结果,根据这个结果中的不为0的某一位将数组分成两组,将两组中的元素进行异或,如两个数组的异或值都不为0,则得到最后结果
具体解释:这里我们是需要找到两个只出现一次的元素a,b。
1. 首先我们把所有的数异或,得到的结果其实就是a与b的异或结果。比如10011001
2. 分组的方法是:选取一个是1的位,然后把所有的数分为两组。这两组满足,第一组该位全为1,第二组该位全为0。首先由于a与b在该位异或为1,那么a,b必然被分到了不同的组。另外相同的数必然在同一组。故这样划分后我们回到了最原始的问题。

2.一个数组中有一个元素只出现1次,其他所有元素都出现k次,求这个只出现1次的元素
[解题思路]
当k为偶数时,依然进行异或即可
当k为奇数时,将数组中每个元素的每一位相加mod k,出现k次的数据对应的二进制的每一位中1的个数是k的倍数,因此最终得到结果即只出现1次的元素,时间复杂度O(nlen),空间复杂度为O(1)

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 腌的生姜太咸了怎么办 机场行李拿错了怎么办 飞机行李拿错了怎么办 剑灵召唤兽死了怎么办 微信红包超10万怎么办 汽车被刮了油漆怎么办 车被轻微刮花了怎么办 车被故意刮花了怎么办 车子自己刮花了怎么办 刚买的新车刮了怎么办 40周胎盘才一级怎么办 没感情了想离婚怎么办 对老公没感情了怎么办 和老公没感情了怎么办 跟老公没感情了怎么办 对老公感情淡了怎么办 和老公感情淡了怎么办 脖子又短又粗怎么办 18岁胸越来越小怎么办 觉得自己变丑了怎么办 我的皮肤很黑怎么办 喝老婆奶水会硬怎么办 真的很讨厌老公怎么办 老婆很讨厌我了怎么办 2岁泰迪牙齿掉了怎么办 4岁泰迪门牙掉了怎么办 种牙寿命结束后怎么办 后面的牙齿掉了怎么办 门牙齿掉了一颗怎么办 隆鼻后鼻头歪了怎么办 狗狗呕吐有虫子怎么办 狗狗呕吐出虫子怎么办 借债人无力还钱怎么办 微博被盗用了怎么办 我的眼袋很严重怎么办 怀孕了吐的很厉害怎么办 老婆怀孕吐的很厉害怎么办 孕妇6个月肚子疼怎么办 孕妇7个月肚子疼怎么办 辣椒吃多了胃疼怎么办 大腿内侧磨烂了怎么办