接好运
点赞 评论

相关推荐

04-20 21:45
已编辑
上海交通大学 C++
第一题 k路字符串 优先级队列第二题 裸的拓扑排序,注意判断是否有环第三题 一开始直接写的最长上升子序列(严格),WA,于是推断山的高度必须是整数,于是对nums[i]-i求最长上升子序列(不严格)AC第四题 样例过,提交之后过0%样例,没看出来哪里错了,贴一下代码 #include using namespace std;int main() {    //数据范围来说,至少是需要n方或者更好的算法    //注意读题,首先不是严格大于,其次需要注意交换需要前提条件,即a[i] > x,这意味着交换过程中,x的数值是原来越大的,和x交换的值的门槛也是越来越大,隐含的条件就是如果小于x的数字没有有序,那么久没办法完成操作了    //手玩一下:    //81 324 218 413 324 x = 18 如果与i>=1的位置交换,剩下的18没人可以换走,直接不可行    //18 324 218 413 324 x = 81 同理,如果与i >= 2的位置交换,剩下的81没有可以换走,直接不可行    //18 81 218 413 324 x = 324 我们选择将413与324交换    //18 81 218 324 324     //再来领悟一下样例    //0 2 3 5 4 x = 1 当前发现后面有一个4在捣乱,我们要想办法把它调整下来,但是要调整,就说明当前x = 1需要换上去到某一个位置,也就只能是和2换,这一步是固定的    //0 1 3 5 4 x = 2 同样的,捣乱的4还没有解决,所以继续要调整,当前x = 2只能换在begin,故而    //0 1 2 5 4 x = 3 begin变成了5的下标    //0 1 2 3 4 x = 5 此时发现已经解决//再来领悟一下输出-1的样例    //11 9 x = 10 当前begin = 0 end = 1,但是注意到nums[end] < x,最终不可以被移动,所以已经寄了    //以上过程说明:对于小于x的内容,如果是已经有序地位于开头,那么就已经不可行了    //对于大于x的无序的内容,如果存在多个,比如10 20 30 40 6 4 x= 3,其中6和4都是乱序的,但似乎此时并不需要决定和其中的谁交换,只能从begin开始交换    //3 20 30 40 6 4 x = 10    //3 10 30 40 6 4 x = 20    //3 10 20 40 6 4 x = 30    //3 10 20 30 6 4 x = 40 爆炸    //至此大胆提出假设:先处理得到其中单增的区间    //0 2 3 5 4 x = 1    //其中比x小的部分已经确保落在该有的位置上了    //0 [2 3 5] [4] x = 1 那么我们会把{[2, 3, 5] x = 1}变化为{[1 2 3] x = 5},即相当于原来有序的空间中最大的没了,最小的变成原有x。花费是有序空间大小    //然后x变成了原有空间中最大的那个,然后继续这样扫描//再来手玩一下:    //4 5 6 7 8 9 10 3 x = 1     //{[4 5 6 7 8 9 10] x = 1}->{[1 4 5 6 7 8 9] x = 10} 由于次大的9还是大于无序的3,所以没办法    //总结思路:线性扫描,找到从开始到现在最长的有序集(其中小于x的部分不统计长度)int t;    cin>>t;    while(t--)    {        int n, x;        cin>>n>>x;        vector nums(n);        for (int i = 0; i < n; ++i) cin>>nums[i];        int begin = 0, end = 0, costBegin = -1;        int ans = 0;        bool flag = true;        while(begin < n)        {            //end begin costBegin x ans            while(end + 1 < n && nums[end + 1] >= nums[end])//扫描到end,并更新end            {                if (costBegin == -1 && nums[end] > x) costBegin = end;                ++end;            }            // cout<<"begin = "<<<", end = "<<<", costBegin = "<<<'\n';            //从begin 到 end 递增,且从costBegin开始大于x            if (end == n - 1) break;            if (begin != end)            {                if (nums[end + 1] < nums[end - 1]) {flag = false; break;}//没办法调整                ans += (end - costBegin + 1);                x = nums[end];                end = begin = end + 2;                costBegin = -1;            }            else            {                if (nums[end] > x && x <= nums[end + 1]) {++ans; x = nums[end]; end = begin = end + 2; costBegin = -1;}                else {flag = false; break;}            }        }        if (flag) cout<<<'\n';        else cout<<"-1\n";    }    return 0;}
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
#面试##腾讯云智##牛客解忧铺#很早就面了4.3号左右吧好像,刚结束就通过了但是最近才约二面自我介绍“讲讲你参加的比赛”“仔细讲讲创新创意的那个比赛”“介绍一下你的项目”“讲讲单点登录?”“你的项目里面怎么实现大模型的?”“你的项目是每个用户分配一个账号?”“你的项目的最高用户量是多少?”“你的项目里面token是怎么解析的?”“项目过程中有没有遇到什么问题?怎么解决的?”“项目里面使用了Redis的哪些数据结构?在哪里使用的?”“Redis的集群知道吗?讲讲主从复制?”“MySql的MVCC知道吗?解决什么问题?”“MySQL的索引结构?B+树为什么不用其他的数据结构?”“主键索引和非主键索引的存储有什么不同?”“你有讲到回表操作,能具体说说吗?”“主键索引和唯一索引有什么不同?”“布隆过滤器怎么使用的?”“布隆过滤器误判的原因了解吗?”“Redis的String类型底层?和java的String有什么不同?”“如果你去学习一个大模型,你的学习方式是什么?”“大概刷了多少道算法题?”“为什么选择找工作?”(还有一些开放性问题,弄忘记了)算法题:动态规划+二分(刚开始没有头绪,面试官很好给了指点)反问(介绍了一下业务,主要是云方面的)(表现还可以,除了我的网络不太好以外)主要都是数据库和Redis相关的问题,项目也只是问了大概怎么设计啥的,整体氛围很好,很轻快#牛客AI配图神器##腾讯云智##面试#发面经吸运气
艾萨克_阿尔伯特:兄弟,算法是面试官口述还是出题
点赞 评论 收藏
分享
牛客网
牛客企业服务