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;
}
}