我是后端开发岗位,题目大家可能不太一样,第一题是链表删除,第二题字符串第K大,第三题拆分位数和,第四题水桶,第五题回文串。
我是4AC,把代码贴出来感觉有点卖弄的意思了,不过因为私下问代码的同学实在是太多了,就发一下吧,一会就要考试了涨涨欧气。
1.pass
2.这里注意长度范围小于5000,但是k的范围是小于5的。
思路是先找a,如果存在找aa,否则找b……直到找到k个数为止。(这里应该有其他思路,不过因为K不大所以我的能过)
#include<bits/stdc++.h> using namespace std; int sum=0; string s; int k; string ans=""; void dfs(int i,string str){ if(k==0)return; if(str.size()!=0){ if(s.find(str)!=-1){ k--; if(k==0)ans=str; }else{ return; } } str+='a'; for(char j='a';j<='z';j++){ str[i]=j; dfs(i+1,str); } } int main(){ cin>>s>>k; dfs(0,""); cout<<ans<<endl; }
3.对于这个数的每一位,如果不是9的话向上一位借10,即是当前位最优解。不过这道题处理起来有点边界数据(因为9的存在),所以代码比较丑。
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll f(ll x){ int ans=0; int p=0; while(x/10){ int t=x%10; t+=p; ans+=t; if(t!=9){ ans+=10; p=-1; } x/=10; } x+=p; ans+=x; return ans; } int main(){ ll x,n; cin>>x; while(x--){ cin>>n; cout<<f(n)<<endl; } }第四题:算简单的分治吧……代码依然有点丑,可以优化一些,但是懒得优化了。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=5e3+10; ll a[maxn]; int n; const ll inf=1e9+10; ll f(int l,int r); ll down(int l,int r){ ll m=inf; for(int i=l;i<r;i++)m=min(m,a[i]); for(int i=l;i<r;i++){a[i]-=m;} ll ans=m; int ll=-1,rr=-1; for(int i=l;i<r;i++){ if(a[i]==0){ if(rr!=-1){ ans+=f(ll,rr); } ll=-1;rr=-1; }else{ rr=i+1; if(ll==-1)ll=i; } } if(ll!=-1)ans+=f(ll,rr); for(int i=l;i<r;i++){a[i]+=m;} return ans; } ll f(int l,int r){ if(l==r)return 0; ll ans=r-l; ans=min(ans,down(l,r)); //cout<<l<<" "<<r<<" "<<ans<<endl; return ans; } int main(){ cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } ll ans=f(0,n); cout<<ans<<endl; }
附加:第三题新写法(没有验证正确性)
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll f(ll x){ if(x<10)return x; int t=x%10; if(t==9)return f(x/10)+9; else return f(x/10-1)+t+10; } int main(){ ll n; while(cin>>n){ cout<<f(n)<<endl; } }
全部评论
(5) 回帖