11 二进制中1的个数
刚开始看到这题确实没有什么思路,因为仅仅知道&和|操作是对位进行操作。所以看了书,发现通过n-1和n的与运算,逐个去除二进制中的1的规律,从而通过这种方法输出1的个数,n-1操作能够保留二进制最左侧1并对其余位依次取反的二进制数,代码如下:
class Solution { public: int NumberOf1(int n) { int count=0; while(n){ ++count; n=(n-1)&n; } return count; } };
12 数值的整数次方
刚刚看到该题感觉就不是很难啊,一个for循环就能解决的问题所以直接就写了一个发现并过不了编译。然后发现其实在该题中,最主要的是对特殊情况的控制,因为对于整数一个for循环足以应付,但是往往会出现0次方和负数次方的情况,所以对这些情况也需要加以判断,代码如下:
class Solution { public: double Power(double base, int exponent) { if(exponent==0) //0次方 return 1; if(exponent==1) return base; double result=1; if(exponent>0){ //正数次方 for(int i=0;i<exponent;i++) result*=base; } else{ 负数次方 base=1/base; for(int i=exponent;i<0;i++) result*=base; } return result; } };
13调整数组顺序使奇数位于偶数前面
初始看的时候觉得难度不大(确实难度也不大),所以一开始思路将数组分为两部分,前一半和后一半,然后奇偶数就可以分开插入了,代码如下:
class Solution { public: void reOrderArray(vector<int> &array) { int a=array.size(); vector<int> tmp=array; int m=0,n=0; for(int i=0;i<a;i++){ if(tmp[i]%2!=0){ array[m]=tmp[i]; m++; } else{ array[a/2+n]=tmp[i]; n++; } } }但是还么开始编译的时候就发现了个问题,因为上面是针对奇偶数数量一样的情况可以很简单的解决,但是倘若奇偶数的数量不同,那么直接通过中间分这么暴力的方法,程序可能会出现越界的情况。所以需要对奇数和偶数先进行个数统计然后再插入,更改后的代码如下:
class Solution { public: void reOrderArray(vector<int> &array) { int a=array.size(); vector<int> tmp=array; int m=0,n=0,k=0; for(int i=0;i<a;i++){ if(tmp[i]%2!=0) k++; } for(int i=0;i<a;i++){ if(tmp[i]%2!=0){ array[m]=tmp[i]; m++; } else{ array[k+n]=tmp[i]; n++; } } } };
通过增加k元素对奇数的个数和偶数开始位置进行标记。
最近确实有点忙,嗯,一是笔试有点多可能没那么多时间更博客,话说明天晚上笔京东,所以后面再看把。