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