1、假设有字符串abcdefg,现要左旋转两位 变成 cdefgab,程序实现
分析:假设只有两个数xy,旋转一次变成yx,再旋转一次变回xy,可发现一个字符串如果旋转两次则变回原顺序,由此,可分别对两个子串进行旋转,然后再对整个串进行旋转,则两个子串还是原来的顺序,而达到旋转的目标。步骤如下:1,旋转ab,得到bacdefg,2、旋转后半个子串,变成bagfedc,,3、旋转整个串得到cdefgab
char *rotateString(
char *str,int n) //把判断n值有效性放到外面
{
int
nLength =
static_cast
<
int
>(strlen(pStr));
char *start=str;
char *mid=str+n-1;
char *end=str+
nLength-1;
reverse(start,mid);
reverse(mid+1,end);
reverse(start,end);
return str;
}
2、输入一个数字n,计算n中含有的1的个数
分析:考验对计算机原理的理解程度,位运算问题,方法1,每次除以2,余数判断是否是1,保留整数部分,相当于数字每次右移一位,判断当前位是否为1,这种方法只对正数有效,代码如下:
int count(int N)
{
int count=0;
while(N)
{
if(N%2!=0
) count++;
N/=2;
}
return count;
}
方法2,每次判断一位,可用n&(n-1),有多少位就要循环多少次,这个算法在编程之美里面有介绍
int count(int N
)
{
int count=0;
while(N
)
{
N=N&(N-1);
count++;
}
return count;
}