58同城2016研发工程师笔试题总结

1.表达式 a+b*c-(d+e)/f 的后缀表达式为:

解析:
如果笔试遇到了选择题: 可以这样快速的得到结果

第一步:按照运算符的优先级对所有的运算单位加括号式子变成拉:(a+(b*c))-((d+e)/f)
第二步:把运算符号移动到对应的括号后面则变成拉:((a(bc)* )+( (de)+f )/- 
              把括号去掉:abc*+de+f/-  后缀式子出现 。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2.一颗深度为5的完全二叉树最少有()个节点

解析:

完全二叉树的意思:每层结点都完全填满,在最后一层上如果不是满的,则只缺少右边的若干结点。所以深度为k的完全二叉树,其节点最少的情况为最后一层只有最左边有一个叶节点,其余各层填满。公式为2^{k-1}。最少为16个节点。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

3.在有序表(5,8,36,48,50,58,88)中二分查找字 58 时所需进行的关键字比较次数是(2),对应的判定树高度为(3)。

解析:
二分查找过程可用二叉树来描述:把当前查找区间的中间位置上的结点作为根,左子表和右子表中的结点分别作为根的左子树和右子树。由此得到的二叉树,称为描述二分查找的判定树(Decision Tree)或比较树(Comparison Tree)。

第一次比较(0+6)/2=3处的元素,第二次比较(3+1,6)/2=5处的元素,刚好找到,此时查找的列表元素包含505888,列表长度为3应该就为判定树的高度。
 

根据有序表建立二叉排序树

      48

     /    \

   8      58

  / \      /   \

5 36   50 88

58在第二层,也就是第二次比较就可以确定了

BST的高度为3,也就是最多要经过3次排序

所以最终结果为 2,3

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

4.假设以行优先顺序存储三维数组 A[5][6][7],其中元素 A[0][0][0]的地址为 1100,且每个元素占 2 个存储单元,则 A[4][3][2]的地  址是(1482)

解析:

以行优先顺序存储三维数组A[5][6][7],首地址为A,每个元素占用两个存储单元,那么第A[i][j][k]个元素的地址为

A[i][j][k]=A+[(i)*6*7+(j)*7+(k)]*2

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

5.马路上有编号 1,2,3...10 的十盏路灯,为节约用电而又不影响照明,可以把其中 3盏灯关掉,但不可以同时关掉相邻的两盏,在两端的灯都不能关掉的情况下,有(20)种不同的关灯方法。

解析:

因为在亮7盏灯,将这7盏灯先点亮
⊙ ⊙ ⊙ ⊙ ⊙ ⊙ ⊙
三盏不亮的灯不能相邻,不能再两端,
故只需将这三盏灯插入到6个空档中,有C(6,3)=20种

代入公式:C(n,m)=P(n,m)/P(m,m) =n!/m!(n-m)!

c(6,3)=6!/3!(6-3)!=6*5*4*3*2*1/3*2*1*3*2*1=20

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

6.房间里有 8 人,分别佩戴着从 1 号到 8 号的纪念章,任选 3 人记录其纪念章号码,最大的号码为 6 的概率(5/28)

解析:

最大为6 那么余下二个只能从1-5中选择,选择方法数目为C(5, 2) 从8个号码中选择3个号码次数C(8, 3) 因此两个相除,比例为  C(5, 2)/C(8, 3) =   (5*4 / 2) / (8*7*6/ 6)  = 5 / 28

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

7.定义 bash 环境的用户文件是?
正确答案: C 你的答案: 空 (错误)
bash &.bashrc
bash & bash_profile
bashrc &.bash_profile
bashrc &.bash_conf

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

8.数组 A 由 1000W 个随机正整数(int)组成,设计算法,给定整数 n,在 A 中找出符合如下等式:n=a+b 的 a 和 b,说明算法思路  以及时间复杂度是多少?

解析:

方法一、数组排序,二分

1000w数字存到数组中,需要的地址空间为1000w*4byte=4w kb =40 Mb。这个容量是可以接受的。

将数组快速排序,平均时间复杂度O(n*logn)

对任给的n,找n=a+b

假设v是排序后的数组,a,b组合无非是

v[0], n-v[0]

v[1], n-v[1]

...

v[i]>=n

通过二分查找来 确定是否存在这一组a,b就是确定n-v[i]是否存在。 最坏需要i*logn次。

所以总时间复杂度为O(nlog(n)*log(n)) //不严格

 

方法二、hash_map

原数组为a,如果a[i]<n,就把(a[i],0)键值对插入到哈希表h中,时间复杂度n

h的pair会按照key自动排序。我们主要是利用他查询复杂度O(1)的特点

确定每组a,b是否存在:

0,n

1,n-1

...

n/2-1,n/2+1

总时间复杂度为O(n)

 

方法三:

直接申请一个大小为N的数组,只要40M空间,然后数组中每一个元素对N取余(当然如果比N还大就直接舍弃),取余的值就放在对于数组下标中。比方N为10,元素8,就放数组第8个元素中,然后看看数组第二个元素有没有值就好了。所以复杂度为o(n)

该方法不对,用数组下标标记元素i固然没错。但是问题在于整数n的上限可能很高,n=2^32时,申请一个大小为n的数组,需要的空间大小为2^32 * 4byte  ≈ 4GB,太大了。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

9.数据库中有学院表和成绩表
学院表 t_school 结构如下:
学院 ID: school_id,学院名称:school_name
成绩表 t_score 结构如下:
学号:id.姓名:name,分数:score,学院 ID:school_id
请用 sql 语句查询出学院名称为"计算机系"的分数最高的前 20 位的学生姓名

解析:

select score.name 
from t_school school, t_score score 
where school.school_id = score.school_id and school.school_name="计算机系" 
order by score.score desc limit 20

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

10.请用时间复杂度最低的方法找出数组中数值差距最大的两个元素的差值?

java版:

package shuaTi;

public class max_min {

	public static void main(String[] args) {
		int result;
		int[] number = new int[] {1,2,5,9};
		result = FindTheNumber(number);
		System.out.println(result);
	}
	
	public static int FindTheNumber(int[]  num) {
		if(num == null||num.length==0) {
			return 0;
		}
		int max,min;
		max = num[0];
		min=num[0];
		for(int i=1;i<num.length;i++) {
			if(num[i]>max) {
				max = num[i];
			}
			if(num[i]<min) {
				min = num[i];
			}
		}
		return max-min;
		
	}
}

Python版:

def findTheNumber(num):
    if num == None or len(num) == 0:
        return 0
    max = num[0]
    min = num[0]
    for i in range(len(num)):
        if num[i]>max:
            max = num[i]
        if num[i]<min:
            min = num[i]
    return max-min
    print(max)
    print(min)


if __name__ == "__main__":
    number = [4,0,7,2,10]
    result = findTheNumber(number)
    print(result)

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凤凰AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值