剑指offer(十三)

61. 构建乘积数组

由于不能使用除法,使用数组C 表示 A[i] 左边的乘积,D表示 A[i] 右边的乘积,两者相乘即得结果。

class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        if(A.size()<=1) return {};
        int size=A.size();
        vector<int> B(size,1);
        vector<int> C(size,1);
        vector<int> D(size,1);
        for(int i=1;i<size;i++){
            C[i]=A[i-1]*C[i-1];
            D[size-i-1]=A[size-i]*D[size-i];
        }
        for(int i=0;i<size;i++){
            B[i]=C[i]*D[i];
        }
        return B;
    }
};

62. 变态跳台阶

通过列举找到规律,通过递归求值。

class Solution {
public:
    int jumpFloorII(int number) {
        if(number<=0) return 0;
        if(number==1) return 1;
        res+=jumpFloorII(number-1);
        return res+1;
    }
private:
    int res=0;
};

这个规律总结的更彻底。

class Solution {
public:
    int jumpFloorII(int number) {
        if(number<0) return 0;
        if(number<=1) return 1;  
        return pow(2,number-1);
    }
};

63. 矩形覆盖

变相的斐波那契数列

class Solution {
public:
    int rectCover(int number) {
        if(number<=0) return 0;
        if(number<=2) return number;
        return rectCover(number-1)+rectCover(number-2);
    }
};

华为笔试题:字符串分段

若段内有单引号或逗号会用双引号围住。

#include <iostream>
using namespace std;

int main() {
    string str;
    cin>>str;
    int flag=1;
    vector<string> res;
    string temp="";
    if(str.size()<=0) return 0;
    for(int i=0;i<str.size();i++){ 
        //找第一个引号和最后一个引号
        if(str[i]=='"' && i!=str.size()-1 && flag) flag=0;
        else if(str[i]=='"' && !flag && (i==str.size()-1 ||(i+1<str.size() && str[i+1]==','))) flag=1;
        if(flag && (str[i]==',' || i==str.size()-1)){
            if(i==str.size()-1)  temp+=str[i];
            if(temp!=""){
                 res.push_back(temp);
                 temp="";
             } 
            else res.push_back("--");
        }
        else temp+=str[i];
    }
    cout<<res.size()<<endl;
    for(int i=0;i<res.size();i++){
        if('0'<=res[i][0] && '9'>=res[i][0]){
            int num=0;
            for(int j=0;j<res[i].size();j++)
                num=num*10+res[i][j]-'0';
            cout<<num<<endl;
        }
        else cout<<res[i]<<endl;
    }

}

华为笔试题:寻找101

输入十进制数,找二进制下101.

#include <iostream>
using namespace std;

int main() {
    int num;
    cin>>num;
    int count=0,index=0,temp=0,indexflag=0;
    int flag=0;
    while(num>0){
        if(num&1==1){
            num=num>>1;
            if(flag==0) flag=1;
            else if(flag==2) flag=3;
            else flag=0;
        }
        else{
            num=num>>1;
            if(flag==1) flag=2;
            else flag=0;
        }
        if(flag==3){
            if(!indexflag){
                index=temp-2;
                indexflag=1;
            }
            count++;
            flag=1;
        }
        temp++;
    }
    if(count)
        cout<<count<<' '<<index<<endl;
    else
        cout<<count<<' '<<-1<<endl;
}

华为笔试题:社交app按亲密度推荐好友

#include <iostream>
void DFS(vector<vector<int>> num, int index,vector<int>& visited,vector<int>& kscore,int n){
    for(int i=0;i<num.size();i++){
        if(num[index][i]!=0 && (visited[i]==-1 || visited[i]>n)){
            visited[i]=n;
            kscore[i]=index;
            DFS(num,i,visited,kscore,n+1);
        }
    }
}
int main() {
    //m个成员,求index成员的n度好友
    int m,index, n;
    cin>>m>>index>>n;
    
    vector<vector<int>> num(m,vector<int>(m,0));
    //i成员与j成员的亲密度为k,没有默认0    
    int count,i,j,k;;
    cin>>count;
    while(count--){
        cin>>i>>j>>k;
        num[i][j]=k;
        num[j][i]=k;
    }
    //是否访问以及是几度,设置如果这次访问的度比上回的小则重新访问该节点
    vector<int> visited(m,-1);
    visited[index]=0;
    //记录遍历时的上家是哪个
    vector<int> kscore(m,-1);
    DFS(num,index,visited,kscore,1); 
    //求亲密度
    vector<int> res;
    vector<vector<int>> score;
    for(int i=0;i<m;i++){
        int temp=0;
        if(visited[i]==n){
            int x=i;
            while(kscore[x]!=-1){
                temp+=num[x][kscore[x]];
                x=kscore[x];
            }
            score.push_back({temp,i});
        }
    }
    //按亲密度倒序排序输出结果
    sort(score.rbegin(),score.rend());
    for(int i=0;i<score.size();i++){
        res.push_back(score[i][1]);
    }
    if(score.size()<=0) res.push_back(-1);
    for(int i=0;i<res.size();i++){
        cout<<res[i]<<endl;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值