首页 > 腾讯8.23笔经(4ac)
头像
菜瓜瓜瓜
编辑于 2020-08-24 15:02
+ 关注

腾讯8.23笔经(4ac)

我是后端开发岗位,题目大家可能不太一样,第一题是链表删除,第二题字符串第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) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐