136. Single Number

除了一个数字,其他数字都出现了两遍。

用异或解决,亦或的特点:1.相同的数结果为0,不同的数结果为1

            2.与自己亦或为0,与0亦或为原来的数

class Solution {
public:
int singleNumber(vector<int>& nums) {
if(nums.empty())
return -;
int res = ;
for(int i = ;i < nums.size();i++)
res ^= nums[i];
return res;
}
};

137. Single Number II

除了一个数字其他数字都出现了三遍。

因为数字为int型,就有32位。统计每个位上1的个数,然后在每位取余,余下的每位的结果肯定是那个单独的数在每位的结果

https://www.cnblogs.com/grandyang/p/4263927.html

class Solution {
public:
int singleNumber(vector<int>& nums) {
int res = ;
for(int i = ;i < ;i++){
int tmp = ;
for(int j = ;j < nums.size();j++){
tmp += (nums[j] >> i) & ;
}
res |= (tmp % ) << i;
}
return res;
}
};

260. Single Number III

有两个数字都只出现了一次,其他数字都出现了两遍。

两个只出现一次的数字在所有位中肯定有一位是不同的,所以亦或出来可以将两个数分开,剩下数无论那一位是否为1肯定都是成对出现,这个时候就可以利用136. Single Number的方法单独处理两个小的数组。findFirstOne其实就是找生成的结果第一个为1的,这个index实际上可以用第几位来表达,比如返回结果3,就是第三位。但我这样处理,直接返回第三位为1,其他位为0,方便之后直接划分数组。

class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
vector<int> result;
if(nums.empty())
return result;
int num = ;
for(int i = ;i < nums.size();i++)
num ^= nums[i];
int index = findFirstOne(num);
vector<int> nums1,nums2;
for(int i = ;i < nums.size();i++){
if(nums[i] & index)
nums1.push_back(nums[i]);
else
nums2.push_back(nums[i]);
}
int num1 = ;
for(int i = ;i < nums1.size();i++)
num1 ^= nums1[i];
result.push_back(num1);
int num2 = ;
for(int i = ;i < nums2.size();i++)
num2 ^= nums2[i];
result.push_back(num2);
return result;
}
int findFirstOne(int num){
int index = ;
int tmp = num & index;
while(!tmp){
index = index << ;
tmp = num & index;
}
return index;
}
};

剑指offer40 数组中只出现一次的数字:

错误写法:

class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int length = data.size();
if(length <= )
return;
int num = ;
for(int i = ;i < length;i++){
num = num ^ data[i];
}
int number = FindFirst1(num);
vector<int> data1;
vector<int> data2;
for(int i = ;i < length;i++){
if(data[i] & number)
data1.push_back(data[i]);
else
data2.push_back(data[i]);
}
*num1 = ;
*num2 = ;
for(int i = ;i < data1.size();i++){
*num1 ^= data1[i];
}
for(int i = ;i < data2.size();i++){
*num2 ^= data2[i];
}
}
int FindFirst1(int num){
int number = ;
int res = num & number;
while(res == ){
number << ; //这里并没有对number进行更新
res = num & number;
}
return number;
}
};

正确写法:

class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int length = data.size();
if(length <= )
return;
int num = ;
for(int i = ;i < length;i++){
num = num ^ data[i];
}
int number = FindFirst1(num);
vector<int> data1;
vector<int> data2;
for(int i = ;i < length;i++){
if(data[i] & number)
data1.push_back(data[i]);
else
data2.push_back(data[i]);
}
*num1 = ;
*num2 = ;
for(int i = ;i < data1.size();i++){
*num1 ^= data1[i];
}
for(int i = ;i < data2.size();i++){
*num2 ^= data2[i];
}
}
int FindFirst1(int num){
int number = ;
int res = num & number;
while(res == ){
number = number << ;
res = num & number;
}
return number;
}
};

leetcode 136. Single Number 、 137. Single Number II 、 260. Single Number III(剑指offer40 数组中只出现一次的数字)的更多相关文章

  1. LeetCode——Single Number II(找出数组中只出现一次的数2)

    问题: Given an array of integers, every element appears three times except for one. Find that single o ...

  2. LeetCode——Single Number(找出数组中只出现一次的数)

    问题: Given an array of integers, every element appears twice except for one. Find that single one. No ...

  3. leetcode 136. Single Number ----- java

    Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...

  4. 不一样的猜数字游戏 — leetcode 375. Guess Number Higher or Lower II

    好久没切 leetcode 的题了,静下心来切了道,这道题比较有意思,和大家分享下. 我把它叫做 "不一样的猜数字游戏",我们先来看看传统的猜数字游戏,Guess Number H ...

  5. leetcode 1365. How Many Numbers Are Smaller Than the Current Number

    Given the array nums, for each nums[i] find out how many numbers in the array are smaller than it. T ...

  6. LeetCode 136、137、260(只出现一次的数,异或性质及应用)

    First. 陈列一下“异或”的一些性质 异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1. 它与布尔运算的区别在于,当运算符两 ...

  7. [LeetCode]面试题53 - I. 在排序数组中查找数字 I(二分);面试题53 - II. 0~n-1中缺失的数字(二分)

    ##面试题53 - I. 在排序数组中查找数字 I ###题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 ...

  8. leetcode 203. Remove Linked List Elements 、83. Remove Duplicates from Sorted List 、82. Remove Duplicates from Sorted List II(剑指offer57 删除链表中重复的结点)

    203题是在链表中删除一个固定的值,83题是在链表中删除重复的数值,但要保留一个:82也是删除重复的数值,但重复的都删除,不保留. 比如[1.2.2.3],83题要求的结果是[1.2.3],82题要求 ...

  9. LeetCode:“剑指 Offer”

    LeetCode:"剑指 Offer" 刷题小菜鸡,花了几天时间做了一遍 LeetCode 上给出的 "剑指 Offer" 在此做一下记录 LeetCode主页 ...

随机推荐

  1. 柯里化与python装饰器

    当需要对已定义的函数进行功能扩展但又不能去改变原有函数时就会用到装饰器.装饰器在python中是非常常用且重要的功能,是一种python的语法糖. 在理解装饰器之前先看下面的加法函数: def add ...

  2. 一统江湖的大前端(2)—— Mock.js + Node.js 如何与后端潇洒分手

    <一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的是有 ...

  3. 第43章 添加更多API端点 - Identity Server 4 中文文档(v1.0.0)

    您可以向托管IdentityServer4的应用程序添加更多API端点. 您通常希望通过它们所托管的IdentityServer实例来保护这些API.这不是问题.只需将令牌验证处理程序添加到主机(请参 ...

  4. 第37章 资源所有者密码验证(Resource Owner Password Validation) - Identity Server 4 中文文档(v1.0.0)

    如果要使用OAuth 2.0资源所有者密码凭据授权(aka password),则需要实现并注册IResourceOwnerPasswordValidator接口: public interface ...

  5. asp.net DES加密解密

    数据加密标准DES加密算法是一种对称加密算法,DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小.这是一个迭代的分组密码,使用称为 Feistel 的技术,其中 ...

  6. 微信公众号页面的web页面键盘弹起问题

    今天开发的过程中,遇到了一个小问题,是这样的,  UI的设计稿中有个底部的按钮是相对于屏幕定位的,但是这个页面还有一个输入框:具体情况请看下图: 这就造成了当我们输入框获取焦点的时候,键盘弹起,下面的 ...

  7. NLP&深度学习:近期趋势概述

    NLP&深度学习:近期趋势概述 摘要:当NLP遇上深度学习,到底发生了什么样的变化呢? 在最近发表的论文中,Young及其同事汇总了基于深度学习的自然语言处理(NLP)系统和应用程序的一些最新 ...

  8. ArcGIS Server较早版本切片迁移注意事项

    原创文章,转载须标明出处自: http://www.cnblogs.com/gisspace/p/8286838.html -------------------------------------- ...

  9. Android 轮播图Banner切换图片的效果

    Android XBanner使用详解 2018年03月14日 08:19:59 AND_Devil 阅读数:910   版权声明:本文为博主原创文章,未经博主允许不得转载. https://www. ...

  10. Docker 创建 Confluence6.12.2 中文版

    目录 目录 1.介绍 1.1.什么是Confluence? 2.Confluence的官网在哪里? 3.如何下载安装? 4.对 Confluence 进行配置 4.1.设置 Confluence 4. ...