21/4/4美团java开发笔试
五道编程题 分成两部分
第一部分4道
第二部分一道
状态不是很好 一直很懵 做题的时候
A 0.18
不重复子串
没找到规律 骗了0.18
#include<iostream> #include<vector> using namespace std; int main(){ string s; cin>>s; vector<vector<int>>num(s.size(),vector<int>(26,0)); for(int i=0;i<s.size();i++){ for(int j=0;i>0&&j<26;j++){ num[i][j]=num[i-1][j]; } num[i][s[i]-'a']++; } // for(int i=0;i<s.size();i++){ // for(int j=0;j<26;j++){ // cout<<num[i][j]<<" "; // }cout<<endl; // } return 0; }
B 0.45
球体 按 经度 维度 切块数
时间到了 之后1分钟 才想起来 平面 过中心 切的 规律
脑子蒙蒙的 这也没想出来
#include<iostream> using namespace std; int jj[180]; int ww[360]; int main(){ int n; cin>>n; long long jing=0,wei=0; int a,b; for(int i=0;i<n;i++){ cin>>a>>b; if(a==0){ ww[b]=1; } if(a==1){ jj[b%180]=1; } } for(int i=0;i<180;i++){ if(jj[i]==1)jing++; // if(ww[i]==1)wei++; } for(int i=0;i<360;i++){ if(ww[i]==1)wei++; // if(ww[i]==1)wei++; } cout<<(jing+1)*(wei+1); return 0; }
C 1
#include<iostream> #include<math.h> //#include<sstream> using namespace std; //stringstream sm; string ss(int t){ if(t==1){ return "1"; } string s; string s1 = to_string(1); //sm<<1; //sm>>s1; string s2 = to_string(t) ; //sm<<t; //sm>>s2; //cout<<s2<<endl; for(int i=2;i<=sqrt(t);i++){ if(t%i==0){ s1=s1+to_string(i); //sm<<t/i; //string tt = ""+t/i; string tt = to_string(t/i); //sm>>tt; //cout<<tt<<endl; if(i*i!=t){ s2=tt+s2; //cout<<s2<<endl; } } } s= s1+s2; //cout<<s<<endl; return s; } int contain(string s1,string s2){ for(int i=0;i<s1.size();i++){ for(int j=0;j<s2.size();j++){ if(s1[i]==s2[j]){ cout<<j<<" "<<s2.size() <<endl; if(j==s2.size()-1){ return 1; } continue; }else{ break; } } } return 0; } int fun(int t,int k){ string s = ss(t); string p = to_string(k); //sm<<k; //p = sm.str(); //sm>>p; //cout<<s<<endl; string::size_type pos; pos = s.find(p); if(pos != s.npos){ return 1; }else{ return 0; } //return contain(s,p); } int main(){ int n,k; cin>>n>>k; int count=0; for(int i=0;i<n;i++){ int t; cin>>t; //cout<<fun(t,k)<<endl; count+=fun(t,k); } cout<<count; return 0; }
D 0.09
给二维数组
从1蹦到k 算最小花费
写半天没过 样例
#include<iostream> #include<vector> #include<math.h> using namespace std; struct node{ int x; int y; int val=0; }; int main(){ int n,k; cin>>n>>k; vector<vector<int>>nums(n,vector<int>(n)); vector<bool>bl(k+1); vector<vector<node>>value(k+1,vector<node>() ); int t; int count=0; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cin>>t; nums[i][j]=t; node nn; nn.x=i; nn.y=j; nn.val=0; value[t].push_back(nn); if(bl[t]==false){ bl[t]=true; count++; } } } int ans = 99999; if(count!=k){ cout<<"-1"<<endl; return 0; }else{ for(int i=2;i<=k;i++){ for(int j=0;j<value[i].size();j++){ int min = 999999; node x = value[i][j]; cout<<x.val<<" "<< i <<endl; for(int p=0;p<value[i-1].size();p++){ node y = value[i-1][p]; cout<<abs(x.x-y.x)<<" "<<abs(x.y-y.y)<<" "<<y.val<<endl; int sum = abs(x.x-y.x)+abs(x.y-y.y)+y.val; cout<<sum<<endl; if(sum<min){ min = sum; } } value[i][j].val = min; } if(i==k){ for(int j=0;j<value[i].size();j++){ if(value[i][j].val<ans){ ans = value[i][j].val; } } } } } cout<<ans<<endl; return 0; }
E 1
发糖 必须从 0 开始连续拿 可以一个不拿 求最大值
#include<iostream> using namespace std; int main(){ int a,b,t; cin>>a>>b; int suma=0; int sumb=0; int mmax=0,mmbx=0; for(int i=0;i<a;i++){ cin>>t; suma+=t; if(suma>mmax){ mmax=suma; } // if(suma<0){ // suma=0; // } } for(int i=0;i<b;i++){ cin>>t; sumb+=t; if(sumb>mmbx){ mmbx=sumb; } // if(sumb<0){ // sumb=0; // } } if(mmax<0)mmax=0; if(mmbx<0)mmbx=0; cout<<mmax+mmbx<<endl; return 0; }
全部评论
(2) 回帖