2012.9.26的笔试面试(XX的一天)

来源:互联网 发布:js设置p标签内容 编辑:程序博客网 时间:2024/06/11 03:01


9.25小米笔试
1.
usigned int a=11;
int b=-2;
int c=0;
while(a+b>0)
{
    a=a+b;
    c++;
}

求返回的C的值

答:陷入到无限循环中,while循环不终止,无法输出c的值,因为a为unsigned类型,其值始终为正。

2.括号的问题:{{[()]}},正确的匹配,问{],(]等错误的匹配,问函数test(string s)判断字符串是否有误
3.写函数给字符串添加正确数量的括号来修正错误,问添括号的方法
4.另外两道编程大题。(一道矩阵染色的问题;一道浮点型数据求区域乘积最大的问题)



9.26趋势科技面试
1.是否有过多线程编程
2.SOCKET流程
3.如果要在socket中选取特定的ip该怎么做
4.介绍进程通信IPC,及方法
5.互斥锁
6.TCP与UDP的区别



9.26金山面试
1.泛型编程
2.智能指针
3.左连接和右连接的区别
4.实现一个简单的聊天程序该怎么做



9.26百度研发二面
1.重载new运算符

2.两个字符串a和b,字符串c,判断c是不是由a和b按照各自的顺序构造出来的

自己想到的方法是遍历c字符串,同时遍历字符串a和b进行判断,根据下标位置判断是否满足要求,但是有一些特殊情况没有考虑到,如a为abc,b为aef,c为aefabc,此时遍历a和b时,下标经过了各自的开头a时,不能再回去,想用标志位来记录有过改变的情况,情况很复杂没成功。在网上查些资料,是POJ2192,典型的方法是动态规划。

//  abc  def  -->  adbcef  √//  abc  aef  -->  aefabc  √ #include <iostream>#include <string>using namespace std;int dp[100][100];int main(){    string str1, str2, str3;    cout<<"Please input three strings: "<<endl;    cin>>str1>>str2>>str3;    int len1=str1.size(), len2=str2.size(), i, j;        // init    for(i=1;i<len1+1;i++)    {            if(str3[i-1]==str1[i-1])            dp[i][0]=1;            else            break;    }    for(j=1;j<len2+1;j++)    {            if(str3[j-1]==str2[j-1])            dp[0][j]=1;            else            break;    }        // dp    for(i=1;i<len1+1;i++)    {                         for(j=1;j<len2+1;j++)                             dp[i][j]=(dp[i][j-1] && str3[i+j-1]==str2[j-1])||(dp[i-1][j] && str3[i+j-1]==str1[i-1]);    }    //if(dp[i][j])  i and j are already out of range    if(dp[len1][len2])        cout<<"YES"<<endl;    else        cout<<"NO"<<endl;        return 0;}
其中的dp[i][j]表示利用str1的前i个字符和str2的前j个字符能否顺序组成str3的前i+j个字符,若成功则置1,否则置0。状态转移方程为:dp[i][j]=(dp[i][j-1] && str3[i+j-1]==str2[j-1])||(dp[i-1][j] && str3[i+j-1]==str1[i-1])。还需要注意的就是初始化,动态规划就是需要从初始的情况逐步递推出最后的结果。还有一些操作C++的string类型对象问题,如string类型的长度size()函数,见:C++中string类型的总结,最后需要注意的就是字符数组的边界值。


3.给定数组n个数,求n-1个数乘积的最大值
4.给定数组n个数,求是否有一定范围内数的和为0

首先想到的算法是依次遍历数组中的每个数,求数组的序列和,若为0则返回,算法时间复杂度为O(n^2)。

应该是有复杂度更低的方法,自己没想出来,在网上查资料找到了一种解法。

“如果某个sum值出现两次或两次以上,则说明它们之间部分的和为0”。

如:输入整数序列: 2 -3 3 1 0

     计算sum[i]的值: 2 -1 2 3 3

其中2和3都出现了两次,说明有两个区间的和值为0,问题转化为求sum数组中是否有相同的数。故算法如下:

①开辟数组sum,保存计算出的sum[i]的值。  O(n)

②判断sum中是否有相同值,首先遍历一遍寻找数组中的最大最小值,建立差值范围大小的哈希表初始化置零。  O(n)

③再次遍历sum数组,对应哈希表中的值,若出现则置一,从而判断是否有重复值。 O(n)

所以这种算法总的时间复杂度为O(n),只是需要一定的空间消耗,为数组sum,O(n)和哈希表O(N),N为范围值。


9.26百度测试面试
1.C++的类模板,编写一个类模板可以装载各种容器
2.有大量数据的表,优化表的查询(拆表;加索引等)
3.红黑树的概念,解决的问题和哈希表的区别
4.搜索引擎中中文分词的方法(在有字典的情况下)

5.电视机性能测试




原创粉丝点击