剑指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>