暴风影音笔试总结-2013年

1.溢出和越界有什么区别?
溢出一般指超出表示或者存储的范围,比如数据溢出,用short存储大于2^16的数会造成溢出,比如申请的内存超过可用内存大小。
或者字符串拷贝超出数组长度。
越界没啥好说的,一般是指访问到了数组范围之外的区域。
2.是一个选择题,给一个字符串,然后问下面四个选项哪一个不可能是其入栈和出栈之后的结果。
3.TCP建立连接后,用send函数发送5次,每次100字节,问recvfrom要最多多少次,最少多少次。
最多少一次?最多?500次?
4.给一个字符串要求转换为整数,字符串中可能包含+-号,比如 “12345”得到12345
这个题目很蛋疼,正常C的标准输入输出中有sscanf函数可以直接从字符串中读取整数,只需要判断第一位是不是符号就可以了。然是这道题目显然不是这个意思。
常规的写法就是一个循环,如果是符号位则记录并跳过,如果是数字则把已有的结果*10然后加上即: temp =temp*10 + ch-'0';最后把符号加上就好了。
5.给前序遍历和终须遍历,要求写程序得到后序遍历。
这个题目很有意思,大家都知道怎么手算得到后续遍历,但是程序实现呢?显然最直接方式就是还原二叉树然后后序遍历。更简单的方法就是迭代或者递归了。

我用的迭代的方式,用一个栈来存储字符串,先将中序遍历入栈。然后对前序遍历的每个字符,与栈顶比较,若栈顶为长度为1的字符串,直接输出,这是后续的一个字符了。如果当前先序字符与栈顶相同,则看下一个前序字符。如果栈顶字符串长度不为1,则先出栈,然后用先序字符入栈,再用先序字符将刚出站的字符串分成两个字串,右子树入栈,左子树入栈。重复以上步骤直到先序字符串遍历完。然后将栈中剩余元素输出即得到后续遍历字符串。代码如下:

// 树的遍历.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void Tree(char* str1, char* str2, char*& str3);
int _tmain(int argc, _TCHAR* argv[])
{
      char* str1="abdgcefh";
      char* str2="dgbaechf" ;
      char* str3 =NULL;
      Tree(str1,str2,str3);
      printf("%s\n",str3);
      return 0;
}

void Tree(char* str1, char* str2, char*& str3)
{

      char* m_stack[100];
      int top=0,index=0;
      char* str=NULL;
      str3 = (char*) malloc(strlen(str1));
      m_stack[top]=(char*) malloc(strlen(str1));
      strcpy(m_stack[top],str2);
      for(unsigned int i=0;i<strlen(str1);)
      {
      
            str = m_stack[top--];
            if(strlen(str)==1)
            {

                  str3[index++]=str[0];
                  if(str1[i] == str[0])
                  i++;
            }else
            {
                  int flag =0;
                  int j=0;
                  for(j=0;j<strlen(str);j++)
                  {
                        if(str[j] == str1[i])
                        {
                              flag=1;
                              break;
                        }
                  }
                  //先入栈
                  m_stack[++top]=(char*)malloc(2);
                  m_stack[top][0]=str1[i];
                  m_stack[top][1]='\0';
                  i++;
                  if(flag ==1)
                  {

            
                        if (j < strlen(str)-1)
                        {
                              m_stack[++top]=(char*) malloc(strlen(str)-j);
                              strcpy(m_stack[top],str+j+1);
                        }
                        if(j>0)
                        {
                              str[j]='\0';
                              m_stack[++top]=(char*) malloc(j);
                              strcpy(m_stack[top],str);
                        }
                  }
            }
      }
      while (top>-1)
      {
            str3[index++] = m_stack[top--][0];
      }
      str3[index]='\0';
}
当然,这个题目貌似用递归代码会更简单。 
6.这是一个动态规划的题目了,给一个nxn的网格,问从一个顶点出发,不能往回走,到达对角顶点有多少中走法。

没啥可说的,动态规划算去吧。
http://blog.csdn.net/doc_sgl/article/details/11667791
http://blog.csdn.net/liyuye/article/details/11680795

还有一个题目是关于sizeof运算符的

void GetSize(char str[])
{
      void* p = malloc(15);
      printf("%d\n%d",sizeof(str),sizeof(p));
}


int _tmain(int argc, _TCHAR* argv[])
{
      //printf("sizeof(StructDef)=%d\n",sizeof(StructDef));
      char * str="hello.";
      //char temp[9]="hello.";
      GetSize(str);
      //printf("%d\n",sizeof(temp));
      return 0;
}

问输出是多少,这个地方我理解错误了,sizeof是编译时确定的!而不是运行时确定的,所以除了某个类实例之外,其他情况都是对变量类型的字节数的确定。

sizeof("hello.") 和题目中的值会不一样,因为字符串常量在编译时确定,而sizeof(str)实际上就是数组指针的字节数,这个题目的答案应该是4,4

今天看了一下阿里的面试题,其中问到hash_map和map的区别,以及实现方式。

区别就是一个存的是哈希之后的键和值,存储和访问等都是线性的。

而map是有序存储键值对,插入和删除都会改变内部结构。

hash_map是基于hash_table实现的,而map是基于红黑树实现的。


个人资料
Bingo
等级:9
文章:694篇
访问:38.9w
排名: 1
上一篇: 暴风影音校招技术笔试题(长春站)-2014年
下一篇:暴风影音实习-PHP研发面经-2013年
猜你感兴趣的圈子:
暴风影音笔试面试圈
标签: str3、str、str1、char、stack、面试题
隐藏