字符串旋转&数字中1的个数

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;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值