【Single Num II】cpp
题目:
Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
代码:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int result = ;
const int W = sizeof(int)*;
int *count = new int[W]();
for (size_t i = ; i < nums.size(); ++i)
{
for (size_t j = ; j < W; ++j)
{
count[j] += (nums[i] >> j) & ;
}
}
for (size_t i = ; i < W; ++i)
{
if ( count[i]%!= )
{
result += ( << i);
}
}
delete []count;
return result;
}
};
Tips:
1. 算法原理:由于都是int型的,只需要记录每个bit上1出现的次数;如果1出现的次数不是3的倍数,则将该位置置为1,并赋值到result中。
这道题主要是熟悉下位运算的各种操作,有时巧用位运算,可以大大提升代码效率。
================================================================
学习了另一种解法,代码如下:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int one=, two=, three=;
for (size_t i = ; i < nums.size(); ++i)
{
two |= (one & nums[i]);
one ^= nums[i];
three = two & one;
one &= ~three;
two &= ~three;
}
return one;
}
};
参考链接:https://leetcode.com/discuss/857/constant-space-solution
简单说就是,用二进制模拟三进制运算。
循环体中的五条语句分别做了如下的事情:
1. 算上nums[i]之后,1出现了两次的bit位数有哪些
(包括两种情况:a.原来就是2次的,nums[i]在该bit上是0;原来是1次的,nums[i]在该bit上是1)。
2. 算上nums[i]之后,1出现了一次的bit位数有哪些。
3. 算上nums[i]之后,1出现了三次的bit位数有哪些
4和5. 满3进位,清空。
这里可能会有一个疑问:1出现次数为一和为二的能否算重了?
假设nums[i]在某一个bit上是0:
a. 算two的时候,这一位不会影响原来two这一bit的取值。
b. 算one的时候,相当于该bit与0异或,保持不变。
假设nums[i]在某一个bit上是1:
a. 算two的时候,如果one在该bit上也是1,则two这一bit取1,如果one在这一位上是0,则two这一bit上不变。
b. 算one的时候,相当于该bit与1异或,取反。如果one原来是1,则进位,one置为0;如果one原来是0,则变为1。
对比颜色相同的两端文字,可以知道是不会算重复的。
想到这里还有一个疑问:two = two | (one & nums[i]),如果某一bit上two原来就是1,并且还有进位了,那这?
这种case是不可能出现的:因为one two three初始都是0,假如连着三个nums[i]在某个bit上都为1,则three在该bit上就为1了。后面两条语句,就保证了two和one被清空了,因此永远不会出现two原来是1并且有进位的情况。
======================================================
第二次过这道题,想了一段时间。大体思路已经想出来了,但是位运算操作(“左移多少位再跟1进行与操作”这些的技巧)参考了书上的code。代码还是一次AC了。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int int_bits = sizeof(int)*;
vector<int> count(int_bits,);
// count each '1' in each bit
for ( int i=; i<nums.size(); ++i )
{
for ( int j=; j<count.size(); ++j )
{
count[j] += (nums[i] >> j) & ;
count[j] = count[j] % ;
}
}
// extract single number
int single = ;
for ( int i=; i<count.size(); ++i )
{
single = single + ( count[i] << i );
}
return single;
}
};
还是这种思路好记一些,二进制代替三进制运算的那个并没有印象了。
【Single Num II】cpp的更多相关文章
- 【Word Break II】cpp
题目: Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where e ...
- 【Unique Paths II】cpp
题目: Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. H ...
- 【Path Sum II】cpp
题目: Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the give ...
- 【Spiral Matrix II】cpp
题目: Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. ...
- 【palindrome partitioning II】cpp
题目: Given a string s, partition s such that every substring of the partition is a palindrome. Return ...
- 【Jump Game II 】cpp
题目: Given an array of non-negative integers, you are initially positioned at the first index of the ...
- 【Combination Sum II 】cpp
题目: Given a collection of candidate numbers (C) and a target number (T), find all unique combination ...
- 【Word Ladder II】cpp
题目: Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) ...
- 【N-Quens II】cpp
题目: Follow up for N-Queens problem. Now, instead outputting board configurations, return the total n ...
随机推荐
- 构建第一个Spring Boot2.0应用之集成dubbo上---环境搭建(九)
一.环境: Windows: IDE:IntelliJ IDEA 2017.1.1 JDK:1.8.0_161 Maven:3.3.9 springboot:2.0.2.RELEASE Linux(C ...
- Mono for Android 设计器错误:Disconnected from layout renderer
今早打开vs2012 android 项目的时候出现如下错误提示: 查了半天,终于在官方网站得到答案.(http://forums.xamarin.com/discussion/143 ...
- MySQL-数据类型及选择
一.数据类型 详见:http://www.runoob.com/mysql/mysql-data-types.html 二.类型选择 整形>date,time>enum,char>v ...
- 服务器 PyTorch 报错 重装 PyTorch
两个代码,pix2pix + CycleGan , wgan-gp 都是 pytorch 写的, 在服务器端运行,均存在下列问题,故判定是 pytorch 的安装问题. Traceback (mos ...
- Project Euler 第一题效率分析
Project Euler: 欧拉计划是一系列挑战数学或者计算机编程问题,解决这些问题需要的不仅仅是数学功底. 启动这一项目的目的在于,为乐于探索的人提供一个钻研其他领域并且学习新知识的平台,将这一平 ...
- JS中的异常exception
js提供了一套异常处理机制.异常是干扰程序的正常流程的不寻常事故,当发生这样的事故时,你的程序应该抛出一个异常 try_it() { try { console.log(add("1&quo ...
- Java操作Redis工具类
依赖 jar 包 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis< ...
- Webpack机制、原理简单小结
一.webpack的构成 entry 代表项目的入口 module 开发中,每一个文件可以看作一个module chunk 代码块 loader 模块转化器 plugin 扩展插件,自定义w ...
- 避免修改Android.mk添加cpp文件路径
手工输入项目需要编译的cpp文件到Android.mk里的缺点 1)繁琐,如果cpp文件很多,简直无法忍受 2)手工输入过程中容易出现错误 3)如果cpp文件更改名称,需要修改android.mk文件 ...
- hello spring boot neo4j
新建springboot 项目: https://www.cnblogs.com/lcplcpjava/p/7406253.html bug fixs: 1. Maven Configuration ...