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

  1. 字母表示26进制
  2. 二进制中1的个数(面试题10)& 左移右移代替乘除取膜
  3. 位运算相关题目

1.字母表示26进制
题目:Excel2003中,用A表示第1列,B表示第2列……Z表示第26列,AA表示第27列,AB表示第28列……以此类推。写一个函数,输入用字母表示的列号编码,输出他是第几列
分析思路:
  1. 该题是针对进制出的题目,看出这是字母表示的26进制就不难了
  2. 最初的做法(限制了位数):
    • 定义转换的位数(即输入几个字母)
    • 固定进制位的低位在数组num的低位或高位
  3. 改进,不限制位数,在写出最初做法的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;
}











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值