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


#笔经##腾讯##C++工程师#
全部评论
其实第3题递归实现起来比较方便,第4题代码可以优化短一些。
点赞 回复 分享
发布于 2020-08-24 14:52
为什么借10 比如89  9+8就是最优解呢。  98 18+8 就是最优解。
点赞 回复 分享
发布于 2020-08-24 14:41
第三题什么情况。
点赞 回复 分享
发布于 2020-08-24 14:25
第二题可以用字典序,最后十分钟才想到,没写完真的气死了。结束后几分钟写完了
点赞 回复 分享
发布于 2020-08-24 08:41
感谢大佬
点赞 回复 分享
发布于 2020-08-24 07:18

相关推荐

HR_丸山彩同学:你的项目描述里,系统设计讲了很多:MemCube是什么、三级存储架构怎么设计、四种遗忘策略分别是什么。这些面试的时候讲没问题,但简历上不需要这么细。 简历要突出的是影响力,不是实现细节。面试官看简历的时候想知道的是「这个项目有多大价值」,不是「这个项目具体怎么实现的」。实现细节是面试时候聊的 怎么改:技术细节可以精简为一句「采用三级存储架构+四种遗忘策略」,把省出来的篇幅用来写影响力。比如:项目有没有开源?有没有写成技术博客?有没有被别人使用过? 校园经历没有任何信息量,任何人都可以写这句话,写了等于没写。更关键的是,你投的是技术岗,校园活动经历本来就不是加分项。如果非要写,必须写出具体的数字和成果。如果你没有这些数字,那就老老实实删掉 「端到端耗时缩减30-40%」要给出确切数字和绝对值。从1000ms降到600ms是降了40%,从100ms降到60ms也是降了40%,但这两个含义完全不一样。其他也是,涉及到数据,准备好证据,口径统一,面试会问 「熟练」「熟悉」「了解」混在一起用,读起来很乱。而且「了解前端需求」最好改成「具备前后端协作经验」
点赞 评论 收藏
分享
评论
6
16
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务