网易笔试aazz题动态规划解法;贝壳内推

开局广告:请看我的发帖,有贝壳找房、阿里、美团内推。贝壳内推14号18:00截止!

尽量加群,我在群里分享了很多笔试面试经验和重点,比如你们今天考的java内存分配、垃圾回收、三道有两道动态规划、二分思想、排列组合这些我都给群里同学列过重点。

内推帖子传送门:qq群号830300740

这类编程题一般空间管够,但是很容易超时,导致有的同学明明方法对了,但是却只过了30% 50%的情况出现。

这个时候就不得不安利一波动态规划了,用记忆数组的空间换取时间,在笔试编程题中是永远不会超时的。

算法思路如下:时间复杂度应该是m✖️n+m+n;空间复杂度应该是一个m✖️n数组,但是比其他方法少了很多递归调用

总结一下以上方法的关键点是

1.通过举例分析、结合二进制分析发现动态规划方法的状态变化方程,也就是f(m,n)跟f(m-1,n)以及f(m,n-1)的关系。

2.结合“二分”思想,一步步比较、拆解。

3.与这个题目类似的有你们做的另外一个题目,苹果堆二分法判断的题目、求数组中第K大的数的题目。

4.容易出错的地方有m、n、k的值的动态变化做的不对导致出错。

思路通俗一点就是:

第一位是1的比第一位是0的大,第一位是0还是1可以把字典所有字符分成最大的一类和最小的一类,并且我们能算出以1开头的最大的那一类有多少个,0开头同理。然后要你找第K小的数(字符),到哪一类里面去找只要把K和0开头的字符个数比较就行?以此类推,继续一位位拆分下去

有人说想要代码,我觉得代码是其次的东西,算法的逻辑思路,以及思路是怎么来得比较重要,面试的时候会当面考察。

代码各种语言不一样,自己写吧

#网易##贝壳找房##内推##笔试题目#
全部评论
另外两个题目我也看了,只写了这个是觉得这个很多同学明明会做但是超时了,写出来意义大一点
点赞 回复 分享
发布于 2018-08-12 00:44
至于我为什么会写这个,实在是闲的无聊
点赞 回复 分享
发布于 2018-08-12 00:44
群在哪里啊
点赞 回复 分享
发布于 2018-08-12 01:00
另外记得用double存个数,用long会30%,比如我
点赞 回复 分享
发布于 2018-08-12 01:17
时间复杂度应该是m*n+(m+n)吧。 m+n是一位位把a或z放上去所消耗的 个人猜测o(k)级别的时间复杂度会导致超时?测试用例肯定是多组的 而且k的范围是小于10^9 至于您说的动态规划求字符串数量那部分我是直接循环计算的 计算次数最多也就m*n*(m+n) 前面部分m*n是计算每一位放置之后剩余能组成的字符串数量 用double的原因就是直接计算先累乘再除(侥幸的是double刚刚好能满足题目要求不溢出 您的计算方式更好一些)
点赞 回复 分享
发布于 2018-08-12 01:41
请问已经发送过简历,还需要再官网注册简历吗
点赞 回复 分享
发布于 2018-08-12 01:50
可以当方案数大于k 就令他等于k  因为最大就是k
点赞 回复 分享
发布于 2018-08-12 08:17
思路远比代码重要啊
点赞 回复 分享
发布于 2018-08-12 09:25
厉害,👍,这个解析
点赞 回复 分享
发布于 2018-08-12 09:44
广告群而已,没必要加,就是各种要求你转发,然后截图。
点赞 回复 分享
发布于 2018-08-12 09:54
#include<iostream> #include<vector> using namespace std; //string s; void f(int x,int y,int k,vector<vector<int>> a,string s); int main() {     int x=10;     int y=12;     vector<vector<int>> a(y+1,vector<int>(x+1,0));     for(int i=0;i<=y;i++)         a[i][0]=1;     for(int i=0;i<=x;i++)         a[0][i]=1;     for(int i=1;i<=y;i++)         for(int j=1;j<=x;j++)             a[i][j]=a[i-1][j]+a[i][j-1];     for(int i=0;i<=y;i++)         {         cout<<i<<"行: ";             for(int j=0;j<=x;j++)             cout<<a[i][j]<<" ";         cout<<endl;         }     string s="";    f(x,y,111,a,s); return 0; } void f(int x,int y,int k,vector<vector<int>> a,string s) {     if(k>a[y][x]) {cout<<"too big K"<<endl;return;}     if(x==0||y==0)         {for(int i=0;i<x;i++)             s.push_back('a');         for(int i=0;i<y;i++)             s.push_back('z');         cout<<s<<endl;         return;         }     int nu=0;     for(int i=0;i<=x;i++)         if(nu+a[y-1][i]>=k)             {for(int j=0;j<x-i;j++)                 s.push_back('a');             s.push_back('z');             f(i,y-1,k-nu,a,s);break;             }         else nu+=a[y-1][i]; } 跟楼主思路差不多,C++的,X Y分别代表a和z的个数,k是第几个。
点赞 回复 分享
发布于 2018-08-12 09:57
群里还有阿里美团内推
点赞 回复 分享
发布于 2018-08-12 18:44
感谢楼主!!!!!!!!!!!!!!!!!!!!!!受教了,,,,,,这才真的看会了!!!!!!!!!!!!!!!!!!!!!
点赞 回复 分享
发布于 2018-08-12 19:42
有点厉害呀,动态规划之前刷少了,在看这个,觉得思路清晰
点赞 回复 分享
发布于 2018-08-25 08:56

相关推荐

11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
offer多多的六边形战士很无语:看了你的博客,感觉挺不错的,可以把你的访问量和粉丝数在简历里提一下,闪光点(仅个人意见)
点赞 评论 收藏
分享
点赞 51 评论
分享
牛客网
牛客企业服务