狗东无人车一面两个算法题,20200311,动规、二进制

23 篇文章 0 订阅

1、左上角到右下角最大路径和。

解:动规不解释。

2、0到非负整数m之间所有整数,各自的二进制表示中1的个数。

解:递推,i:前一个数若最后的二进制位是0,则当前数的二进制1个数是前一个数二进制个数+1;ii:前一个数最后的二进制位是1,则向前找连续的二进制1的个数nCount,当前数的二进制1个数是前一个数二进制个数-nCount+1;

#include<iostream>
/*
1\二维矩阵,
*/
#include<vector>
using namespace std;
int ShortestPath(vector<vector<int> >arr){
    vector<vector<int> > dp(arr.size(),vector<int>(arr[0].size(),0));
    dp[0][0]=arr[0][0];
    for(int col(1);col<arr[0].size();col++){    //第一行
        dp[0][col]=dp[0][col-1]+arr[0][col];    //只能左边来
    }
    for(int row(1);row<arr.size();row++){   //第一列
        dp[row][0]=dp[row-1][0]+arr[row][0];    //只能上边来
    }
    for(int row(1);row<arr.size();row++){
        for(int col(1);col<arr[0].size();col++){
            dp[row][col]=std::min(dp[row][col-1],dp[row-1][col])+arr[row][col];
        }
    }
    return dp[arr.size()-1][arr[0].size()-1];
};
//
int get1Count(int n){
    //返回n的二进制表示中bit1的个数
    int i(0),nCount(0);
    while(i<sizeof(int)*8){
        if((n>>i)&1)nCount++;
        i++;
    }
    return nCount;
};
void get0m1Count(int m){
    vector<int> arrCount(m+1,0);
    for(int i(0);i<=m;i++){
        arrCount[i]=get1Count(i);
    }
};
void get0m1Count(int m){
    vector<int> arrCount(m+1,0);
    arrCount[0]=0;
    for(int i(1);i<=m;i++){
        //如果前面一个数的最右一个二进制为是0,那么二进制1个数+1;
        //如果前面一个数的最有一个二进制位是1,那么求1连续的个数n,当前数字的二进制1个数就是前面数字二进制1个数的和减去n+1
        if(!(arrCount[i-1]&1)) arrCount[i]=arrCount[i-1]+1;
        else{
            //找1连续的个数
            int j(1),nCount(1);
            while(arrCount[i-1]>>j++&1) nCount++; //
            arrCount[i]=arrCount[i-1]-nCount+1;
        }
    }
}
int main(int argc,char* argv[]){

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值