11-13 剑指offer代码即思路(二进制中1的个数,数值的整数方,调整数组顺序使奇数位于偶数前面)

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元素对奇数的个数和偶数开始位置进行标记。
最近确实有点忙,嗯,一是笔试有点多可能没那么多时间更博客,话说明天晚上笔京东,所以后面再看把。

猜你喜欢

转载自blog.csdn.net/u010404530/article/details/79850711
今日推荐