leetcode 136. Single Number 、 137. Single Number II 、 260. Single Number III(剑指offer40 数组中只出现一次的数字)
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 数组中只出现一次的数字)的更多相关文章
- LeetCode——Single Number II(找出数组中只出现一次的数2)
问题: Given an array of integers, every element appears three times except for one. Find that single o ...
- LeetCode——Single Number(找出数组中只出现一次的数)
问题: Given an array of integers, every element appears twice except for one. Find that single one. No ...
- leetcode 136. Single Number ----- java
Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...
- 不一样的猜数字游戏 — leetcode 375. Guess Number Higher or Lower II
好久没切 leetcode 的题了,静下心来切了道,这道题比较有意思,和大家分享下. 我把它叫做 "不一样的猜数字游戏",我们先来看看传统的猜数字游戏,Guess Number H ...
- 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 ...
- LeetCode 136、137、260(只出现一次的数,异或性质及应用)
First. 陈列一下“异或”的一些性质 异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1. 它与布尔运算的区别在于,当运算符两 ...
- [LeetCode]面试题53 - I. 在排序数组中查找数字 I(二分);面试题53 - II. 0~n-1中缺失的数字(二分)
##面试题53 - I. 在排序数组中查找数字 I ###题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 ...
- 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题要求 ...
- LeetCode:“剑指 Offer”
LeetCode:"剑指 Offer" 刷题小菜鸡,花了几天时间做了一遍 LeetCode 上给出的 "剑指 Offer" 在此做一下记录 LeetCode主页 ...
随机推荐
- Hibernate【inverse和cascade属性】知识要点
Inverse属性 Inverse属性:表示控制权是否转移.. true:控制权已转移[当前一方没有控制权] false:控制权没有转移[当前一方有控制权] Inverse属性,是在维护关联关系的时候 ...
- scrapy爬虫学习系列四:portia的学习入门
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- [五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用
reduce-归约 看下词典翻译: 好的命名是自解释的 reduce的方法取得就是其中归纳的含义 java8 流相关的操作中,我们把它理解 "累加器",之所以加引号是因为他并不仅仅 ...
- Python UnboundLocalError和NameError错误根源解析
如果代码风格相对而言不是那么的pythonic,或许很少碰到这类错误.当然并不是不鼓励使用一些python语言的技巧.如果遇到这这种类型的错误,说明我们对python中变量引用相关部分有不当的认识和理 ...
- DSAPI多功能组件编程应用-网络相关(下)
[DSAPI.DLL下载地址] 在本篇,我将重点介绍DSAPI.DLL中Socket编程的使用.众所周知,Socket用起来不难,但是写起来麻烦.我对Socket进行了封装,进行了高度简化.下面我将通 ...
- 从零开始学安全(三十四)●百度杯 ctf比赛 九月场 sqli
先扫后台发现 两个可疑登录界面 l0gin.php login.php 猜测是第一个 用bp 抓包发现 index.php 中间有302 重定向 头文件 里面有一个 page=l0gin.php 应该 ...
- Go开发之路 -- 流程控制
1. if else if 条件 { } else { // else必须写在这里 } // 写一个程序, 从终端读取输入, 并转成整数. 如果转成整数出错, // 则输出'can not conve ...
- Html和Css学习笔记-html进阶-html5属性
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 此篇博客是我的复习笔记,html和css学的时间太久了,忘得差不多了,最近要使用一下,所以重新打开html的书略读,后记录了标签 ...
- 亚马逊 amazon connect(呼叫中心)
背景 公司为提高客服部门沟通效率对接电话呼叫中心,调研后选择了亚马逊的Amazon Connect服务,因为是国外业务没有选择用阿里云,怕有坑. Amazon Connect后台 需要在后台创建“联系 ...
- 十分钟(小时)学习pandas
十分钟学习pandas 一.导语 这篇文章从pandas官网翻译:链接,而且也有很多网友翻译过,而我为什么没去看他们的,而是去官网自己艰难翻译呢? 毕竟这是一个学习的过程,别人写的不如自己写的记忆深刻 ...