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的网格,问从一个顶点出发,不能往回走,到达对角顶点有多少中走法。
没啥可说的,动态规划算去吧。
还有一个题目是关于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是基于红黑树实现的。