剑指Offer--编程题参考代码(1)

剑指Offer的部分编程题以及牛客网的部分练习题参考代码。有自己写的,也有牛客网给的推荐答案。

1.输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

<span style="font-size:14px;">class Solution {
public:
     int  NumberOf1(int n) {
         int sum = 0;
         if(n<0)
             n=~(-n)+1 ;
         while(n)
             {
             n=n&(n-1) ;
             sum++ ;
         }
         return sum ;
     }
};</span>

如果是求二进制中0的个数,则是n=n|(n+1)

2.求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

<span style="font-size:14px;">class Solution {
public:
    int Sum_Solution(int n) {
        if(n<0)
            return -1;
        if(n==0)
            return 0;
        return (Sum_Solution(n-1)+n) ;
    }
};
//这里偷懒就用递归了,有效率更高的解法,大家自己想想
</span>


3.请实现一个函数,将一个字符串中的空格替换成“%20”。

例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy

//length为牛客系统规定字符串输出的最大长度,固定为一个常数
class Solution {
public:
    void replaceSpace(char *str,int length) {
        if (str == NULL || length <= 0)
            return;
        int count = 0;
        int i;
        for (i = 0; str[i] != '\0'; ++i)
            if (str[i] == ' ')
                ++count;
        if (i + 2 * count >= length)
            return;
        for (int j = i; count > 0; --j) {
            if (str[j] != ' ')
                str[j + 2 * count] = str[j];
            else {
                int temp = j + 2 *count;
                str[temp] = '0';
                str[temp - 1] = '2';
                str[temp - 2] = '%';
                --count;
            }
        }
    }
};

4.实现strcpy函数

<span style="font-size:14px;">char * strcpy( char *strDest, const char *strSrc )
{
 assert( (strDest != NULL) && (strSrc != NULL) );
 char *str = strDest;
 while( (*strDest++ = * strSrc++) != ‘\0’ );
 return str;
}</span>

5.分别给出BOOL,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var)

 BOOL型变量:if(!var)   
int型变量: if(var==0)   
float型变量:   
const float EPSINON = 0.00001;   
if ((x >= - EPSINON) && (x <= EPSINON)   
指针变量:  if(var==NULL)   

6.编写一个函数,作用是把一个char组成的字符串循环右移n个。

比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefg”  函数头是这样的:  
//pStr是指向以'\0'结尾的字符串的指针  
//steps是要求移动的n   

<span style="font-size:14px;">void LoopMove ( char *pStr, int steps )
{
 int n = strlen( pStr ) - steps;
 char tmp[MAX_LEN];
 strcpy ( tmp, pStr + n );
 strcpy ( tmp + steps, pStr);
 *( tmp + strlen ( pStr ) ) = '\0';
 strcpy( pStr, tmp );
}
//也可以用memcpy实现。大家可以自己写写
</span>

7.CPU存储的大小端判定

请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1

<span style="font-size:14px;">int checkCPU()
{
 {
 union w
 {
 int a;
 char b;
 } c;
 c.a = 1;
 return (c.b == 1);
 }
}</span>

8.求x和y的最大公约数

 <span style="font-size:14px;">//辗转相除法O(log(n))  
        int susu(int x, int y)  
        {         
            if(x>y)  
            {  
                int t = x;  
                x = y;  
                y = t;  
            }  
            if(x==0)  
            {  
                return y;  
            }  
            return susu(y%x, x);  
        }


//暴力搜索O(n)  
        int susu1(int x, int y)  
        {         
            if(x>y)  
            {  
                int t = x;  
                x = y;  
                y = t;  
            }  
            int result = 1;  
            for(int i=1; i<=x ;i++)  
            {  
                if(x%i==0 && y%i==0)  
                {  
                    result = i;  
                }  
            }  
            return result;  
        } 
</span>


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值