程序员面试修炼 | 这些都不会,怎么拿offer?
Posted 甲骨文WDP华育兴业
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序员面试修炼 | 这些都不会,怎么拿offer?相关的知识,希望对你有一定的参考价值。
软件测试常用方法
白盒测试:
概念:已知产品的内部工作过程,清楚最终生成软件产品的计算机程序结构及其语句,按照程序内部的结构测试程序内部的变量状态、逻辑结构、运行路径等,检验程序中的每条通路是否都能按照要求正确工作,检查程序内部动作或运行是否符合设计规格要求,所有内部成分是否按规定运行。
基本原则:执行测试时,先考虑各个分支被覆盖;再考虑所有逻辑条件分别为真值和假值的测试;如果有更高的质量要求,测试对象流程途中所有独立路径至少被运行一次;检查内部数据结构,注意上下文的影响,以确保测试有效性
黑盒测试:
概念:测试时,把程序看做一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,测试人员针对软件直接进行测试。
能发现以下缺陷:有错误的功能或遗漏了某项功能;不能正确地接收和输入数据,输出错误的结果;功能操作逻辑不合理,不够方便;界面出错、不美观;安装步骤不清晰,不够灵活;系统初始化问题等。
笔试/面试真题真题
题目描述
1、输入一个正数n,输出所有和为n 连续正数序列。
例如:输入15;
由于1+2+3+4+5=4+5+6=7+8=15;
所以输出3 个连续序列1-5、4-6 和7-8。
解题思路:这是网易的一道面试题。
这道题我们用两个数small和big 分别表示序列的最小值和最大值。首先把small 初始化为1,big 初始化为2。如果从small 到big 的序列的和大于n 的话,我们向右移动small,相当于从序列中去掉较小的数字。如果从small 到big 的序列的和小于n 的话,我们向右移动big,相当于向序列中添加big 的下一个数字。一直到small 等于(1+n)/2,因为序列至少要有两个数字。
下面来看解题代码(如果代码页面超出可以左右上下移动):
void PrintContinuousSequence(int small, int big);
// Find continuous sequence, whose sum is n
void FindContinuousSequence(int n)
{
if(n <3)
return;
int small =1;
int big = 2;
int middle =(1 + n) / 2;
int sum =small + big;
while(small< middle)
{
// we are lucky and find the sequence
if(sum ==n)
PrintContinuousSequence(small, big);
// if the current sum is greater than n,
// move small forward
while(sum >n)
{
sum -= small;
small ++;
// we are lucky and find the sequence
if(sum ==n)
PrintContinuousSequence(small, big);
}
// move big forward
big ++;
sum += big;
}
}
// Print continuous sequence between small and big
void PrintContinuousSequence(int small, int big)
{
for(int i = small; i <= big; ++ i)
printf("%d", i);
printf("\n");
}
题目描述
2、输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。
解题思路:
如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位。挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位。由于碰到一个偶数,需要移动O(n)个数字,因此总的时间复杂度是O(n2)。
要求的是把奇数放在数组的前半部分,偶数放在数组的后半部分,因此所有的奇数应该位于偶数的前面。也就是说我们在扫描这个数组的时候,如果发现有偶数出现在奇数的前面,我们可以交换他们的顺序,交换之后就符合要求了。
因此我们可以维护两个指针,第一个指针初始化为数组的第一个数字,它只向后移动;第二个指针初始化为数组的最后一个数字,它只向前移动。在两个指针相遇之前,第一个指针总是位于第二个指针的前面。如果第一个指针向的数字是偶数而第二个指针指向的数字是奇数,我们就交换这两个数字。
下面来看解题代码(如果代码页面超出可以左右上下移动):
void Reorder(int *pData, unsigned int length, bool (*func)(int));
bool isEven(int n);
// Devide an array of integers into two parts, odd in the first part,
// and even in the second part
// Input: pData - an array of integers
// length - the length of array
void ReorderOddEven(int *pData, unsigned int length)
{
if(pData ==NULL || length == 0)
return;
Reorder(pData, length, isEven);
}
// Devide an array of integers into two parts, the intergers which
// satisfy func in the first part, otherwise in the second part
// Input: pData - an array of integers
// length - the length of array
// func - a function
void Reorder(int *pData, unsigned int length, bool (*func)(int))
{
if(pData ==NULL || length == 0)
return;
int *pBegin =pData;
int *pEnd =pData + length - 1;
while(pBegin< pEnd)
{
// if *pBegin does not satisfy func, move forward
if(!func(*pBegin))
{
pBegin ++;
continue;
}
// if *pEnd does not satisfy func, move backward
if(func(*pEnd))
{
pEnd --;
continue;
}
// if *pBegin satisfy func while *pEnd does not,
// swap these integers
int temp =*pBegin;
*pBegin = *pEnd;
*pEnd = temp;
}
}
// Determine whether an integer is even or not
// Input: an integer
// otherwise return false
bool isEven(int n)
{
return (n &1) == 0;
}
题目描述
3、在一个字符串中找到第一个只出现一次的字符。
如输入abaccdeff,则输出b。
解题思路:
看到这道题时,最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n 个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路时间复杂度是O(n2)。我们试着去找一个更快的方法。
由于题目与字符出现的次数相关,我们是不是可以统计每个字符在该字符串中出现的次数?要达到这个目的,我们需要一个数据容器来存放每个字符的出现次数。在这个数据容器中可以根据字符来查找它出现的次数,也就是说这个容器的作用是把一个字符映射成一个数字。在常用的数据容器中,哈希表正是这个用途。
哈希表是一种比较复杂的数据结构。由于比较复杂,STL 中没有实现哈希表,因此需要我们自己实现一个。但由于本题的特殊性,我们只需要一个非常简单的哈希表就能满足要求。由于字符(char)是一个长度为8 的数据类型,因此总共有可能256 种可能。于是我们创建一个长度为256 的数组,每个字母根据其ASCII码值作为数组的下标对应数组的对应项,而数组中存储的是每个字符对应的次数。这样我们就创建了一个大小为256,以字符ASCII 码为键值的哈希表。
我们第一遍扫描这个数组时,每碰到一个字符,在哈希表中找到对应的项并把出现的次数增加一次。这样在进行第二次扫描时,就能直接从哈希表中得到每个字符出现的次数了。
下面来看解题代码(如果代码页面超出可以左右上下移动):
// Find the first char which appears only once in a string
// Input: pString - the string
// Output: the first not repeating char if the string has, otherwise 0
char FirstNotRepeatingChar(char* pString)
{
// invalid input
if(!pString)
return 0;
// get a hash table, and initialize it
constinttableSize=256;
unsignedinthashTable[tableSize];
for(unsignedinti = 0; i<tableSize; ++ i)
hashTable[i] = 0;
// get the how many times each char appears in the string
char*pHashKey = pString;
while(*(pHashKey)!= '\0')
hashTable[*(pHashKey++)] ++;
// find the first char which appears only once in a string
pHashKey = pString;
while(*pHashKey!= '\0')
{
if(hashTable[*pHashKey]== 1)
return *pHashKey;
pHashKey++;
}
// if the string is empty
// or every char in the string appears at least twice
return 0;
}
计算机网络基础常考知识点
一. OSI参考模型
OSI参考模型(OSI/RM)的全称是开放系统互联参考模型,它是由估计标准化组织提出的一个网络系统互联模型。
在OSI参考模型中,每一层都为其上一层提供服务,并未其上一层提供一个访问接口或界面。
1、物理层
物理层规定了激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性。该层为上层协议提供了一个传输数据的物理媒体。在这一层,数据的单位称为bit。
2、数据链路层
3、网络层
网络层负责对子网间的数据包进行路由选择。此外,网络层还可以实现拥塞控制、网际互联等功能。在这一层,数据的单位称为数据包。 网络层协议的代表包括:IP、IPX、RIP、OSPF等。
4、传输层
传输层是第一个端到端,即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制问题。在这一层,数据的单位称为数据段。
传输层协议的代表包括:TCP、UDP、SPX等。
5、会话层
会话层管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。会话层还利用在数据中插入校验点来实现数据的同步。会话层协议的代表包括:NetBios、ZIP等。
6、表示层
表示层对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解。表示层的数据转换包括数据的加密、压缩、格式转换等。表示层协议的代表包括:ASCII、ASN.1、JPEG、MPEG等。
7、应用层
应用层为操作系统或网络应用程序提供访问网络服务的借口。应用层协议的代表包括:Telnet、FTP、HTTP、SNMP等。
二、TCP/IP参考模型
TCP/IP协议栈是ARPANET和其后继因特网使用的参考模型。如下图所示:
1、网络层
实际上TCP/IP参考模型没有真正描述这一层的实现,只是要求能够提供给其上层网际互联层一个访问接口,以便在其上传递IP分组。
2、网络互联层
网络互连层是整个TCP/IP协议栈的核心。它的功能是把分组发往目标网络或主机。同时,为了尽快地发送分组,可能需要沿不同的路径同时进行分组传递。因此,分组到达的顺序和发送的顺序可能不同,这就需要上层必须对分组进行排序。
网络互连层定义了分组格式和协议,即IP协议。网络互联层除了需要完成路由的功能外,也可以完成将不同类型的网络互联的任务。除此之外,网络互连层还需要完成拥塞控制的功能。
3、传输层
在TCP/IP模型中,传输层的功能是使源端主机和目标端主机上的对等实体可以进行绘画。在传输层定义了两种服务质量不同的协议。即:传输控制协议TCP和用户数据报协议UDP。
4、应用层
TCP/IP模型将OSI参考模型中的会话层和表示层的功能合并到应用层实现。应用层面向不同的网络应用引入了不同的应用层协议。其中,有基于TCP协议的,如文件传输协议FTP,虚拟中断协议TELNET,超文本传输协议HTTP等。
想了解更多的关于面试技巧的文章请持续关注哦。觉得有用记得分享哦。
来源:19应届生
大数据招生火热进行中
有想报名进行免费试听的同学可以
点击原文连接或加小骨头QQ(2187963075)进行了解哦!
大有作为
数倍薪资
据为己有
以上是关于程序员面试修炼 | 这些都不会,怎么拿offer?的主要内容,如果未能解决你的问题,请参考以下文章
JAVA程序员为什么拿不到想要的offer这些原因你都了解吗
为了进阿里拿Offer,逼得我两个月吃透了这些Java高级面试题解析,终于上岸
阿里148道核心面试题,(程序员必备学习方向)全会拿offer无压力,月薪45k没问题