劍指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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章