single number i && ii && iii
Problem statement
Elementary knowledge:
There is a popular question when I seeked my job at Beijing: swap the value of two numbers without allocate a new memory.
Normally, there are two solutions:
1 int main(){
2 int a = 3;
3 int b = 5;
4
5 a += b;
6 b = a - b;
7 a = a - b;
8
9 a ^= b;
10 b ^= a;
11 a ^= b;
12
13 return 0;
14 }
Some tricky:
x&(x-1): eliminate the last 1 bit in x
We can use this tricky to test if an integer is the power of 2 in O(1) time;
class Solution {
public:
/*
* @param n: An integer
* @return: True or false
*/
bool checkPowerOf2(int n) {
// write your code here
return n > && (n & (n - )) == ;
}
};
Single Number
Given an array of integers, every element appears twice except for one. Find that single one.
Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Solution one:
For this problem, we should use the knowledge that the XOR operation for two same number will be zero.
class Solution {
public:
int singleNumber(vector<int>& nums) {
int single_val = ;
for(vector<int>::size_type ix = ; ix < nums.size(); ix++){
single_val ^= nums[ix];
}
return single_val;
}
};
Solution two:
Since the array is random, the first action is to sort the array from small to large.
I keep a counter to count the number of current value. The loop ends at the element before the last one since we will compare current element with it`s direct next one. Because of this, we need do some boundary check to make sure there is at least one element in this array
- if they are equal, the counter + 1;
- if they are not equal:
- if the counter is 2, that means current is already end in the array, we need precede to it`s next one, the counter should start from 1 again.
- if the counter is less than 2( it should be 1), that means current only show up once, it is the single we want. return;
- If the function does not return in the while loop, that means the last element is the single value, we return nums.back();
class Solution {
public:
int singleNumber(vector<int>& nums) {
if(nums.empty()){
return ;
}
if(nums.size() == ){
return nums[];
}
sort(nums.begin(), nums.end());
int cnt = ;
for(vector<int>::size_type ix = ; ix < nums.size() - ; ix++){
if(nums[ix] == nums[ix + ]){
cnt++;
} else {
if(cnt < ){
return nums[ix];
} else {
cnt = ;
}
}
}
return nums.back();
}
};
Single Number ii
Given an array of integers, every element appears three times except for one, which appears exactly once. Find that single one.
Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Solution one:
Frist solutiuon is the same with singlue number i, we just need change the value of cnt to be 3, it will works.
class Solution {
public:
int singleNumber(vector<int>& nums) {
if (nums.size() == ) {
return nums[];
}
sort(nums.begin(), nums.end());
int cnt = ;
for (vector<int>::size_type ix = ; ix < nums.size(); ix++) {
if (nums[ix] == nums[ix + ]) {
cnt++;
} else {
if (cnt < ) {
return nums[ix];
} else {
cnt = ;
}
}
}
return nums.back();
}
};
Solution two:
- For each integer, it is represented by 32 bits, we count the number of "1"s for each i
- Do "module 3" operation and "or" operation to put it back to the result.
- Except the single value, other values occur three time, that means the bit should be zero if the count is moduled with 3.
- We will get the value of single number.
class Solution {
public:
int singleNumber(vector<int>& nums) {
int single_val = ;
int bit_sum = ;
for(int i = ; i < ; i++){
bit_sum = ;
for(vector<int>::size_type ix = ; ix < nums.size(); ix++){
bit_sum += (nums[ix] >> i) & ;
}
single_val |= (bit_sum % ) << i;
}
return single_val;
}
};
Solution three:
- ones: means the value when ith bit only occurs once
- twos: means the value when ith bit only occurs twice
- three: measn the value when ith bit only occurs third
class Solution {
public:
int singleNumber(vector<int>& nums) {
int one = , two = , three = ;
for (int i = ; i < nums.size(); ++i) {
two |= one & nums[i];
one ^= nums[i];
three = one & two;
one &= ~three;
two &= ~three;
}
return one;
}
};
Single number iii
Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.
For example: Given nums = [1, 2, 1, 3, 2, 5], return [3, 5].
Note:
- The order of the result is not important. So in the above example,
[5, 3]is also correct. - Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?
The rules for xor operation:
0: two bits are same
1: two bits are different
The xor operation is similiar with an addition without carry.
Solution:
There are two numbers only occur once, which is different with single number i. We can solve it with the single number i, however, we need do some precess before it.
- First, we do xor operations for all element in the array, the result is the xor of two number we want.
- Second, we should find one bit which is different in these two numbers and use this bit as an indicator to different them in next loop
- The bit representation of a negative number is: reverse all bits of its positive number and plus one
- Third, loop all elements in array to do xor operation and get the answer.
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int xor_of_two_numbers = ;
for(vector<int>::size_type ix = ; ix < nums.size(); ix++){
// this is the result of the xor of two single numbers
xor_of_two_numbers ^= nums[ix];
}
// the negative bit representation of each number
// reverse all bits and plus one
// find one bit from the xor result which this two single numbers is different
// different them in next loop
int right_most_bit_of_xor = xor_of_two_numbers & -xor_of_two_numbers;
vector<int> singleNumber();
for(vector<int>::size_type ix = ; ix < nums.size(); ix++){
if(nums[ix] & right_most_bit_of_xor){
singleNumber[] ^= nums[ix];
} else {
singleNumber[] ^= nums[ix];
}
}
return singleNumber;
}
};
single number i && ii && iii的更多相关文章
- LeetCode Single Number I / II / III
[1]LeetCode 136 Single Number 题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数. 解法:容易想到异或的性质,两个 ...
- 【LeetCode】Single Number I & II & III
Single Number I : Given an array of integers, every element appears twice except for one. Find that ...
- Leetcode 137. Single Number I/II/III
Given an array of integers, every element appears twice except for one. Find that single one. 本题利用XO ...
- LeetCode 【Single Number I II III】
Given an array of integers, every element appears twice except for one. Find that single one. 思路: 最经 ...
- 4.Single Number && Single Number (II)
Single Number: 1. Given an array of integers, every element appears twice except for one. Find that ...
- LeetCode: Single Number I && II
I title: Given an array of integers, every element appears twice except for one. Find that single on ...
- LeetCode Single Number I II Python
Single Number Given an array of integers, every element appears twice except for one. Find that sing ...
- Single Number I&& II——还没看,倒过头来再看
Single Number I Given an array of integers, every element appears twice except for one. Find that si ...
- leetcode 136. Single Number 、 137. Single Number II 、 260. Single Number III(剑指offer40 数组中只出现一次的数字)
136. Single Number 除了一个数字,其他数字都出现了两遍. 用亦或解决,亦或的特点:1.相同的数结果为0,不同的数结果为1 2.与自己亦或为0,与0亦或为原来的数 class Solu ...
随机推荐
- yii2.0下拉列表的使用
第一种方法:ActiveForm 类的 dropDownList 方法(优点,默认使用yii的样式) 1.在控制器的方法里面 ,我们需要拿到数据,一定是 findAll() 或者是 all() 方法的 ...
- 利用python的爬虫技术爬取百度贴吧的帖子
在爬取糗事百科的段子后,我又在知乎上找了一个爬取百度贴吧帖子的实例,为了巩固提升已掌握的爬虫知识,于是我打算自己也做一个. 实现目标:1,爬取楼主所发的帖子 2,显示所爬去的楼层以及帖子题目 3,将爬 ...
- linux之date命令详解
date命令的用处 1.用于显示特殊的时间格式,可以用于对日志文件的命名 2.用于设置时间 ,不过这方面用的比较少,因为一般的服务器都设置的有自动同步网络时间 用法: date [OPTION]... ...
- ECMAScript版本号总结
最近想要研究下ES6,关于这个标准的发展历史.ES5. ES6.ES2015等等名称的定义都不怎么明确,查了很多资料,去除了程序员不关心的信息,下面是对ECMAScript规范发展历史及名词定义的 ...
- h5 做app时和原生交互的小常识。
距离上次随笔或许有半年了吧,最近在用hybrid模式开发移动app,所以就简单的说说用h5技术开发app时候,做原生交互的几个小常识: 一.拨打电话或者发送短信: <a href="t ...
- js前端获取页面传递的参数
转载的,先记下: UrlParm = function () { // url参数 var data, index; (function init() { data = []; index = {}; ...
- sql server 去除字符中空格的方法
用的是REPLACE ( original-string, search-string, replace-string )方法,这三个参数分别是:原字符串.要替换的字符串.替换成的字符串 比如:UPD ...
- PT20150801隆重开班
PT20150801隆重开班 伴随着秋天的的脚步,带着对梦想的憧憬,POPTEST1508期学员步入正式学习阶段:POPTEST的课程内容吸收了互联网公司先进技术的特点,同时坚持深入浅出的教育特点,完 ...
- 老李分享:jvm垃圾回收
老李分享:jvm垃圾回收 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478 ...
- DC平衡双向控制解串器 转接IC GM8914:FPD-LINK III转LVTTL芯片
1 概述 GM8914型DC平衡双向控制解串器,其主要功能是实现将2.8Gbps高速串行数据转换成10或12位并行控制信号,并同步输出一路时钟信号:同时低速通道将芯片控制信息调制到高速差分信号上传输给 ...