您的位置:首页 > Web前端

Offer题10 字母表示26进制&二进制中1的个数&位运算相关题目

2016-04-10 11:23 239 查看
字母表示26进制
二进制中1的个数(面试题10)&
左移右移代替乘除取膜

位运算相关题目

1.字母表示26进制
题目:Excel2003中,用A表示第1列,B表示第2列……Z表示第26列,AA表示第27列,AB表示第28列……以此类推。写一个函数,输入用字母表示的列号编码,输出他是第几列



分析思路:

该题是针对进制出的题目,看出这是字母表示的26进制就不难了
最初的做法(限制了位数):

定义转换的位数(即输入几个字母)
固定进制位的低位在数组num的低位或高位

改进,不限制位数,在写出最初做法的return部分时,产生的灵感。。。

long TwentySixSystem(string character) //最初的做法
{
if(character.size()>4 || character.empty())
return -1;
int num[4]={0};
//注意:固定低进制位在num的低位,有2种写法
//int index = 0;
//for(int i=character.size()-1;i>=0;--i)
//    num[index++] = character[i]-'A'+1;
for(unsigned i=0;i<character.size();++i)
num[i] = character[character.size()-1-i]-'A'+1;
return num[0]+26*(num[1]+26*(num[2]+26*num[3]));
}
long TwentySixSystem(string stChar) //改进
{
if(stChar.empty())
return -1;
long nColumn = 0;
for(unsigned i=0;i<stChar.size();++i)
nColumn = 26*nColumn+(stChar[i]-'A'+1);
return nColumn;
}


测试用例:

功能测试:输入多个字母,输入一个字母
边界值测试:输入字母Z、AA
特殊输入测试:输入空字符串

2.二进制中1的个数(面试题10)
题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1,。因此如果输入9,该函数输出2

位运算知识点:

左移:m<<n 最左边n位被丢弃,同时在最右边补上n个0,00001010<<2=00101000,10001010<<3=01010000
右移:m>>n

无符号数:最左边补0
有符号数:正数补0:00001010>>2=00000010 , 负数补1:10001010>>3=11110001

右移>>一位代替÷2,左移<<一位代替×2 ,或者说 n*(2^k) == n<<k
取模:%(2^k) == n&((1<<k)-1)

两种方法:

第一种方法要注意:不要位移输入参数,而要位移flag;因为若n是负数,右移时可能补1
第二种方法比第一种快的原因是:

第一种无论有几个1,都循环32次。。
而第二种(以1100为例)n-1后,n中最右边的1变为0,其后的0都变为1,与运算后都变为0,即1000
重复该运算至n为全0;n有几个1就循环几次!

int NumberOf1(int n){
int count=0,flag=1;
while(flag)    {
if(n&flag)
++count;
flag=flag<<1;
}
return count;
}
int NumberOf1_Fastly(int n)
{
int count=0;
while(n){
n = n & (n-1);
++count;
}
return count;
}

测试用例:

正数(包括边界值1、0x7FFFFFFF)
负数(包括边界值0x80000000、0xFFFFFFFF)
0

3.位运算相关题目

(1) 题目:用一条语句判断一个整数是不是2的整数次方。

分析思路:一个整数如果是2的整数次方,那么它的二进制表示中只有一位是1,其他位都是0,进行一次n&(n-1)运算,就能使n为0

if((n&(n-1))==0)
cout<<"n是2的整数次方"
(2) 题目:输入两个整数m和n,计算需要改变m的二进制表示中的多少位,才能得到n。

分析思路:1.m异或n。2.统计异或结果中1的位数(代码见上面右边)

int count=0;
int result=m^n;
while(result){
result = result & (result-1)
++count;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: