小米 2016届实习生招聘笔试
来源:互联网 发布:php入门看什么书 编辑:程序博客网 时间:2024/06/05 03:25
第一部分:
三道编程题。
1.两个整数的二进制表示中,求不同位数的个数。
比如输入1和2,01和10不同位数为2,故输出为2.
2.选择买入卖出股票的最大收益,要求交易次数为两次,但是第二次买入必须在第一次卖出的时间节点之后。
比如{3,8,5,1,7,8},最大收益为8-3加上8-1,等于12.
3.求linux文件目录中两个分支的最近父节点。
root->0->1->2
|
3->4
此时1和3的最近父节点为0,2和4的最近父节点为0,1和2的最近父节点为1。
输入两个节点indexA和indexB,找出最近连接点,即找出最近父节点。
第二部分:
四道主观题,根据你投的岗位进行选择性答题,客户端、前端、后台等。
由于我投的岗位是客户端,所以只做了第一题和第四题
1.客户端
Bundle是什么?Bundle和Java中Map的区别?Android中为什么不用Map而是使用Bundle传递数据?
2.前端
3.后台
4.编程题
在一个整形数组N中,寻找和为M的两个数,要求复杂度低。如有返回两数,没有返回-1.
第一部分解答
1.基本思想:两数先异或运算,把位数不同的位全部转成1,最后求出二进制结果中1的个数即可。
#include <iostream>using namespace std;int cal(int a, int b) { int M = a ^ b; int num = 0; while(M) { M &= (M-1); num++; } return num; } int main(){int a,b;cin>>a>>b;cout<<cal(a,b)<<endl;return 0;}
2.基本思想:
http://blog.csdn.net/lu597203933/article/details/44998499
此题就是选择买入卖出股票的最大收益,对于第i天卖出的最大收益即为第i天的股市价格减去[0,i-1]天内的最小股市价格,当第i天的股市价格比漆面最低股市价格还低,则更新最低股市价格。然后取最大的股市收益,为DP问题。 用profit[i]表示第i天的收益,则minBuyPrice = min(minBuyPrice, prices[i]),并且profit[i] = prices[i]-minBuyPrice. 然后取profit中的最大值。
动态规划,用两个数组,第一个数组f[i]用来表示在[0,i]内进行买入卖出的最大收益,用g[i]表示在[i,n-1]内进行买入卖出的最大收益。然后最大收益即为max(f[i]+g[i])。
#include <iostream>using namespace std;#define max(a,b) (((a)>(b))?(a):(b))#define min(a,b) (((a)<(b))?(a):(b))int maxProfit(int prices[], int n){int i,minP,maxP,ans=0; int *f=(int *)malloc(sizeof(int)*n);// 表示在[0,i]内进行买入卖出所能获得的最大profitint *g=(int *)malloc(sizeof(int)*n);// 表示在[i,n-1]内进行买入卖出所能获得的最大profit 结果就为max(f1[i]+f2[i]) if(n<2)return 0;else{f[0]=0;g[n-1]=0;for(i=1,minP=prices[0];i<n;i++){minP=min(minP,prices[i]);f[i]=max(f[i-1],prices[i]-minP);}for(i=n-2,maxP=prices[n-1];i>=0;--i){maxP=max(maxP,prices[i]);g[i]=max(g[i+1],maxP-prices[i]);}}for(i=0;i<n;i++){ans=max(ans,f[i]+g[i]);}return ans;}int main(){int prices[6]={3,8,5,1,7,8};cout<<maxProfit(prices, 6)<<endl;return 0;}
3.基本思想:
将连接关系转换为二维数组存储。如A->B有连接则为1,无连接则为0.
indexA和indexB直接相连,则最近父节点为indexA和indexB中较小的一个,
indexA和indexB不直接连接,找出都连接indexA和indexB的节点即为最近父节点。
0 1 2 3 4
0 0 1 0 1 1
1 1 0 1 0 0
2 0 1 0 0 0
3 1 0 0 0 0
4 1 0 0 0 0
连接关系如下:
4
|
0——>1——>2
|
3
方法一:递归遍历
#include <iostream>using namespace std;int find(int a[][5],int indexA,int indexB)//假设二维数组长宽都为5{int result;if(indexA==0 || indexB==0){result=0;return result;}else if(a[indexA][indexB]==1)//直接相连{if(indexA>=indexB)result=indexB;elseresult=indexA;return result;}else if(a[indexA][indexB]==0)//不直接相连{for(int i=0;i<5;i++){if(a[i][indexA]==1 && a[i][indexB]==1){result=i;return result;}else if(a[i][indexA]==1)find(a,i,indexB);//递归else if(a[i][indexB]==1)find(a,indexA,i);}}}int main(){int a[5][5]={0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0};cout<<find(a,1,2)<<endl;cout<<find(a,3,4)<<endl;cout<<find(a,0,4)<<endl;cout<<find(a,2,4)<<endl;return 0;}
方法二:数组存储
基本思想:
不同数组A和B分别存储indexA和indexB的所有父节点,然后从头到尾遍历A和B,找到A和B的第一个相同点,就是最近父节点
#include <iostream> using namespace std; int find(int a[][5],int indexA,int indexB)//假设二维数组长宽都为5 { int result; int A[5]={0}; //存储indexA和indexB的所有父节点int B[5]={0};int xA=indexA;int xB=indexB;int kA=0,kB=0;A[kA++]=indexA;B[kB++]=indexB;for(int k=0;k<5;k++){if(a[k][xA]==1 && k<=xA){A[kA++]=k;xA=k;}if(a[k][xB]==1 && k<=xB){B[kB++]=k;xB=k;}}//此时数组A和B中存储的就是indexA和indexB的所有父节点,下标从大到小//要找indexA和indexB的最近父节点,从头开始遍历数组A和B,找到最小的相同点就是答案//for(int kk=0;kk<5;kk++)//{//cout<<A[kk]<<" "<<B[kk]<<endl;//}int i=0,j=0;while(i<5 && j<5){if(A[i]>B[j])i++;else if(A[i]<B[j])j++;else{result=A[i];break;}}return result; } int main() { int a[5][5]={ 0,1,0,1,1, 1,0,1,0,0, 0,1,0,0,0, 1,0,0,0,0, 1,0,0,0,0}; cout<<find(a,1,2)<<endl;//1 cout<<find(a,3,4)<<endl;//0 cout<<find(a,0,4)<<endl;//0 cout<<find(a,2,4)<<endl;//0 return 0; }
第二部分解答
1..Bundle格式的文件是Unix/Linux系统中的一种可执行文件。用户可以在终端中使用./***(文件名).bundle命令使其运行。必要时需要使用sudo执行以提供超级用户权限,并且需要提供管理员密码。
Bundle和Map区别:
Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值。
相对于Map,它提供了各种常用类型的putXxx()/getXxx()方法,如:putString()/getString()和
putInt()/getInt()。Bundle的内部实际上是使用了HashMap类型的变量来存储putXxx()方法放入的值。
Android开发默认情况下,通过Bundle bundle=new Bundle();传递值是不能直接传递map对象的,解决办法:
第一步:封装自己的map,实现序列化即可
/** * 序列化map供Bundle传递map使用 * Created on 13-12-9. */public class SerializableMap implements Serializable { private Map<String,Object> map; public Map<String, Object> getMap() { return map; } public void setMap(Map<String, Object> map) { this.map = map; }}
第二步:传递数据:
Intent intent=new Intent(ListViewActivity.this,UpdateWatchActivity.class); //传递数据 final SerializableMap myMap=new SerializableMap(); myMap.setMap(map);//将map数据添加到封装的myMap<span></span>中 Bundle bundle=new Bundle(); bundle.putSerializable("map", myMap); intent.putExtras(bundle);
第三步:接收数据:
Bundle bundle = getIntent().getExtras(); SerializableMap serializableMap = (SerializableMap) bundle.get("map");
到此数据就能在通过map传递和使用了。
2.网上这道题泛滥,求数组N中和为M的两个值,就不给代码了。
(1)如果扫两遍,则时间复杂度为O(n^2);
(2)先排序,后二分查找,排序,快排或者堆排O(nlogn),
然后对于每个数i,在排好序的数组中用二分查找找M-i,复杂度O(nlogn)
相加最后时间复杂度还是O(nlogn).
- 小米 2016届实习生招聘笔试
- 腾讯 2016届实习生招聘笔试
- 阿里 2016届实习生招聘笔试
- 2012年小米校园招聘实习生笔试编程题
- 华为2016届实习生招聘(武汉)笔试
- 360 2016届实习生招聘笔试 综合题
- 科大讯飞2014届实习生招聘笔试题
- 科大讯飞2014届实习生招聘笔试题
- 腾讯2016年实习生招聘笔试题
- 2016阿里安全工程师实习生招聘笔试题
- 京东2016实习生招聘笔试详解
- 携程2016实习生招聘笔试题
- 实习生招聘笔试
- 实习生招聘笔试
- 腾讯实习生招聘笔试
- 实习生招聘笔试
- 腾讯实习生招聘笔试
- ebay实习生招聘笔试
- 2014年上海邀请赛C Seam Carving(二维dp)
- poj2299
- 我的android第一课
- 编写可读代码的艺术(一)java&android
- mini2440硬件篇之RTC
- 小米 2016届实习生招聘笔试
- 快捷键收藏
- 工厂模式
- 作业三
- poj2388
- android 百度API定位以及获取天气
- ! LaTeX Error: Something's wrong--perhaps a missing \item.
- android Application类的用法
- Android日常源码操作、git日常操作、linux等