话说有段时间没更微博了,主要专业上的事情太多,况且上周三刚做了网易的笔试题,原打算第二天更新一下,结果没想到一拖拖到今天。正巧今天稍微有点时间,就稍微做下总结。总体来说网易的笔试题选择为20道,填空题为2道,然后还有三道编程题。编程题应该算是三选二,选其中得分高的两道题目。对于C++来说,选择题考试范围比较广,都程序题有一道数组指针题目,另外几道程序题基本考核的点都是不同元素在程序中所占内存的题目,其中包括虚函数指针(4字节)之类的稍微有点难度的对象或者函数,另外有考核操作系统中FIFO(先入先出)的换页的操作以及贪心衍生算法(没学那么深给几个选项一个都没见过只能瞎选了啊)和哈夫曼编码等知识点。总体还是蛮有难度的(可能我比较菜),不过基础的东西也有很多。
编程题:说起来就比较伤了,总体来说就写出来一道,但是由于好像超了内存?没给过编,是不是一道没出来,不过本地算是出了结果。下面写一下编程题第二题(也是唯一写出来的):
看到题目的时候觉得难度应该不算大,主要就是根据输入,先产生数组,可能数组的产生稍微麻烦一点,但是根据C++内部封装的atoi和itoa的功能应该能够比较容易的完成,于是编辑了以后,发现牛客网的识别系统好像并不带atoi和itoa。。。然后就麻烦了,对于这种特殊的数组产生肯定需要使用字符串然后转成数组,就开始自己封装atoi和itoa两个功能,最重要的不需要考虑特殊情况还算是比较可靠,不过过程依旧艰辛,出产以下代码:
#include <iostream> #include <stdio.h> #include <vector> #include <string> using namespace std; int Number(int l,int r){ int answer=0; vector<string> sc; if(l<0||r<0) return answer; string s; for(int i=1;i<=r;i++){ while(i>0){ s+=i%10+'0'; i=i/10; } sc.push_back(s); } for(int i=l-1;i<sc.size();i++){ long number=0; string t=sc[i]; for(int j=0;j<t.size();){ while(t[j]>0&&t[j]<9){ number=number*10+(t[j++]-'0'); } } if(number%3==0) answer++; } return answer; } int main(){ int a,b; while(cin>>a>>b){ cout<<Number(a,b)<<endl; } }然后发现,网上过得了编译,但是输出结果并不对,很麻烦,所以再转到本地编译器调试。发现在atoi的过程中for循环判断出现了不进入循环的状况,且在itoa的判断条件上由于是0和9并不会进入循环,在此提醒一下判断语句中应该使用'0'和'9'来确定范围。,所以更改以后的程序如下:
#include <iostream> #include <stdio.h> #include <vector> #include <string> using namespace std; int Number(int l,int r){ int answer=0; vector<string> sc; if(l<0||r<0) return answer; string s; for(int i=1;i<=r;i++){ int j=i; while(j>0){ s+=j%10+'0'; j=j/10; } sc.push_back(s); } for(int i=l-1;i<sc.size();i++){ long number=0; string t=sc[i]; for(int j=0;j<t.size();){ while(t[j]>'0'&&t[j]<'9'){ number=number*10+(t[j++]-'0'); } } if(number%3==0) answer++; } return answer; } int main(){ int a,b; while(cin>>a>>b){ cout<<Number(2,5)<<endl; } }
话说刚刚看了一下,发现了一个很严重的问题。。。我的输入为啥是Number(2,5)....应该是调试的时候选的免得输入。。结果复制上网的时候没改,难怪过不了编译。。。。提示(内存不够)。还害的我基本连第一题做的时间都没有。
然后那天晚上看了一下别的大神的解。。。发现自己真的弱鸡:
#include <bits/stdc++.h> using namespace std; int main(){ int left, right; cin >> left; cin >> right; int num = (right - left + 1)/3; int ret = 2*num; right -= 3*num; while(left <= right){ ret += (left%3 != 1); ++left; } cout<<ret<<endl; return 0;}
这是啥?这是啥?不用字符串么?不用转么?就15行?。。。感觉解题思路从开始就僵化了,该题解题的主要方法是找规律 嗯嗯,就是找规律。三个数字中没3个中后两个可以被整除,第一个不可以。。。所以通过简单的数值计算就可以计算出结果,并不需要上文那种,又长又笨又过不了编译的方法。。。。扎心了,老铁。
然后第一题由于忙还没来及看,但是稍微看了下答案应该是用贪心解。第三题是个背包问题,看了题目就放弃了,并没有看背包。有空再研究下吧。
至于填空题的话一道是C++单例模式,总的而言就是将构造函数定义为私有函数,然后通过功能函数来建立新的对象,这样无论新建多少指针所指向的地址都为唯一地址。
第二题是register 指令符,并说是否减少了指令的运行次数。嗯,这题我本来记得register会增加子函数的运行效率,即将函数直接存在寄存器中,不必将其从内存取出,但是减少多少步运行就不是很清楚了。于是随便猜了个数字,但昨天看了看好像一步都不会减少,而且register好像并不会提升系统的效率。
所以稍微总结一下给接下来准备笔试的童鞋一定经验借鉴吧。