• 剑指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 < 0)//如果没有输入字符,则报错。  
            {  
                cout << "Invalid input" << endl;  
                return -1;  
             }  
      
        int sum = 0;//如果输入的字符为空字符,输出为0.  
      
        for(int i = 0; i < length; i++)  
        {  
            int temp = str[i] - 'A';  
            if(temp >= 26 || temp < 0)  
            {  
                cout << "Invalid input" << endl;  
                return -1;  
            }  
            sum = 26*sum  + temp + 1;  
         }  
        return sum;  
      
    }  
    int main()  
    {  
        string str;  
        while(getline(cin,str))//这里如果用cin >> str,不能输入空的字符串。   
        cout << StringToInt(str)<<endl;  
        return 0;  
    } 

     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+" ");
          }
    }
  • 相关阅读:
    apache 多站点设置
    关键词使用什么分隔符好
    ASP.NET MVC ModelState与数据验证【转】
    Sealed,new,virtual,abstract与override的区别
    ASP.NET MVC4中调用WEB API的四个方法
    wcf 基础连接已经关闭: 连接被意外关闭
    解决MySQL不允许从远程访问的方法有哪些?
    PHP魔法函数 自动转义 magic_quotes_gpc和magic_quotes_runtim
    Html.RenderPartial与Html.RenderAction 用法
    MVC中的扩展点 ActionResult
  • 原文地址:https://www.cnblogs.com/hupp/p/4520463.html
Copyright © 2020-2023  润新知