剑指offer—算法之位运算(二进制中1的个数)
位运算:
左移:m<<n将m左移n位,左移后低位补充0;
右移:m>>n将m右移n位,右移后高位补充的是符号位,负数补充1,整数补充0.(正数的边界值为(1,ox7FFFFFFF),负数的边界值为(ox80000000,oxFFFFFFFF))
题目一:请实现一个函数,输入一个整数,输出这个数的二进制表示中1的个数。
思路一:将二进制数i与1相与,判断是否为1,然后将tag=1左移一位得到tag=2,然后再与i相与,循环结束的条件是tag==0;该算法的时间复杂度为输入的i的位数。
#include <iostream>
using namespace std;
int numberOf1(int n)
{
int count=0;
int tag=1;
while(tag)
{
if(tag&n)
count++;
tag=tag<<1;
}
return count;
} void main()
{ int i;
while(cin>>i)
{
cout<<numberOf1(i)<<endl;
}
}
思路二:把一个整数n减去1,再和原来的整数与运算,会把该整数的最右边的1变成0,那么,一个整数的二进制中有多少个1,就可以进行多少次这样的操作。循环结束的条件是n为0;
#include <iostream>
using namespace std;
int numberOf1(int n)
{
int count=0; while(n)
{
++count;
n=(n-1)&n;
}
return count;
} void main()
{ int i;
while(cin>>i)
{
cout<<numberOf1(i)<<endl;
}
}
Java代码:
public class ByteCompute {
public int byteCompute(int n){
int tag=1;
int count=0;
while(tag!=0){//由于int类型的函数是32位因此要循环32次
if((n&tag)!=0)
count++;
tag=tag<<1; }
return count;
}
public int byteCompute1(int n){
int count=0;
while(n!=0){//由于每次n和n-1相与都会导致,n的最右边的为1的元素变成0,因此总共要循环的次数就是1的个数次。
count++;
n=(n-1)&n;
}
return count;
} public static void main(String[] args){
int n=3;
ByteCompute bc=new ByteCompute();
int count=bc.byteCompute(n);
int count1=bc.byteCompute1(n);
System.out.println(count+" "+count1);
}
}
题目二:用一条语句判断一个整数是不是2的整数次方。
思路:一个整数如果是2的整数次方,那么它的二进制表示中有且仅有一个位是1,而其他所有位都是0,根据上面的分析,把这个整数减去1后再与自己相与,唯一的1也会变成0.
题目三:输入两个整数m和n,计算需要改变n的几位可以得到m。
第一步先将这m和n异或,然后再数1的个数。
题目四:在Excel2003中,用A表示第一列,用B表示第二列,用C表示第三列....用z表示第26列,AA表示第27列,用AB表示第28列.....依次类推,请写一个函数输入字母表 示列号,输出是第几列。(十进制转换为26进制的问题)
思路:写一个函数返回值为整型,如果输入的字符串s为空则返回空,定义并初始化一个最终的返回值sum=0,设置一个行动下标i,当i满足小s.length()时,定义一个临时的整型变量temp=s[i]-'A'用来存放单个位置上的由字符变成的数字。只有当temp是在0~26的范围之间的时候才有sum=sum*26+temp+1.
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int StringToInt(const string& str)
{
int length = str.length();//这里也可用str.size(). if(length < )//如果没有输入字符,则报错。
{
cout << "Invalid input" << endl;
return -;
} int sum = ;//如果输入的字符为空字符,输出为0. for(int i = ; i < length; i++)
{
int temp = str[i] - 'A';
if(temp >= || temp < )
{
cout << "Invalid input" << endl;
return -;
}
sum = *sum + temp + ;
}
return sum; }
int main()
{
string str;
while(getline(cin,str))//这里如果用cin >> str,不能输入空的字符串。
cout << StringToInt(str)<<endl;
return ;
}
java代码:
public class StringToInt {
public int stringToInt(String str){
int len=str.length();
if(len<0)
throw new RuntimeException("inVaild input!");
int sum=0;//输入为空的时候,输出0;
for(int i=0;i<len;i++){
int temp=str.charAt(i)-'A';
if(temp<26&&temp>=0)
sum=26*sum+temp+1;
}
return sum;
}
public static void main(String[] args){
String str="AAZ";
StringToInt sti=new StringToInt();
int sum=sti.stringToInt(str);
System.out.println(sum+" ");
}
}
剑指offer—算法之位运算(二进制中1的个数)的更多相关文章
- 剑指Offer面试题:9.二进制中1的个数
一.题目:二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. 二.可能引起死循环的解法 一个 ...
- 剑指Offer面试题:8.二进制中1的个数
一 题目:二进制中1的个数 题目:请实现一个整数,输出该数二进制表示中1的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. 二 可能引起死循环的解法 // 计算整数的二 ...
- 《剑指offer》面试题10 二进制中1的个数 Java版
书中方法一:对于每一位,用1求与,如果为1表明该位为1.一共要进行32次,int4字节32位. public int check(int a){ int result = 0; int judge = ...
- 《剑指offer》面试题15. 二进制中1的个数
问题描述 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输入:00000 ...
- 剑指Offer(书):二进制中1的个数
题目:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 分析:下面这两种方法都可以,不过第二种更好一些. public int numberOf1(int n) { int count ...
- 剑指offer算法_位运算求和
不用+,-,*,/运算求和,可以分成三步: 1.计算两个数字的异或值,相当于只计算每一位的和,不计算进位,得出结果sum: 2.计算两个数字的与值,相当于求出两个数字的进位,然后左移一位,相当于进位, ...
- 剑指offer 11. 位运算 二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. //思想:用1(1自身左移运算,其实后来就不是1了)和n的每位进行位与,来判断1的个数 private stat ...
- 剑指offer编程题Java实现——面试题10二进制中1的个数
题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变 ...
- 剑指offer算法总结
剑指offer算法学习总结 节选剑指offer比较经典和巧妙的一些题目,以便复习使用.一部分题目给出了完整代码,一部分题目比较简单直接给出思路.但是不保证我说的思路都是正确的,个人对算法也不是特别在行 ...
随机推荐
- poj 1511(SPFA+邻接表)
题目链接:http://poj.org/problem?id=1511 思路:题目意思很简单就是要求源点到各点的最短路之和,然后再求各点到源点的最短路之和,其实就是建两个图就ok了,其中一个建反图.1 ...
- 自己的gitignore文件
*.bak*.txt*.vm.gitignore#svn.svn/# built application files*.apk*.ap_ # files for the dex VM*.dex # J ...
- ios开发--animation flash动画
/** * showAnimationFlash */ + (void)showAnimationFlashWithView:(UIView *)animationView durati ...
- Qt之图形(Source和Dest相互覆盖的取舍,真的很方便)
源码 ... painter.drawImage(0, 0, destinationImage); painter.setCompositionMode(QPainter::Composition ...
- Java应用发布后,需要关注的7个性能指标
在某个重大发布之后,都需要记录相应的指标,本文介绍了最重要的几个 Java 性能指标,包括响应时间和平均负载等.为理解应用程序在生产环境中如何运行,就需要遵循一些 Java 性能指标. 在以前,当软件 ...
- iOS:核心动画之转场动画CATransition
转场动画——CATransition CATransition是CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果.iOS比Mac OS X的转场动画效果少一点 U ...
- power designer 连接数据库提示“connection test failed”
利用powerdesigner反向生成表结构时,需要mysql连接,配置好连接,测试时直接报:connection test failed”! OS:WIN7 旗舰版 64位 JDK: 64位 Pow ...
- Action的执行
异步Action的定义 两种异步Action方法的定义 xxxAsync/xxxCompleted 这种形式的异步只能定义在实现了AsyncController的Controller中.针对Task的 ...
- 《Linux shell变量总结回顾》RHEL6(转)
文章版权:http://www.cnblogs.com/linux-super-meng/ 环境变量路径: [root@localhost ~]# set //查看到的是局部变量和全局变量2种 [ ...
- MVC 的知识
MVC 的知识 下载地址: 1. NET Framework4下载地址: http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyI ...