程序员面试修炼08 | 京东2016笔试题

上帝通常会用三种方式给曾经付出的人们作答:他点头给你想要的;他摇头给你更好的;他让你等待,然后给你最好的。——刘强东

image

名词解释

1、DHCP:(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,或者给内部网络管理员作为对所有计算机作中央管理的手段。

2、UDP:全称是User Datagram Protocol, 意思是用户数据报协议。是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!是应用程序之间的简单通信。UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的UDP协议。

image

笔试/面试真题真题

题目描述(京东-2016笔试题)

果园里有一堆苹果,一共n头(n大于1小于9)熊来分,第一头为小东,它把苹果均分n份后,多出了一个,它扔掉了这一个,拿走了自己的一份苹果,接着第二头熊重复这一过程,即先均分n份,扔掉一个然后拿走一份,以此类推直到最后一头熊都是这样(最后一头熊扔掉后可以拿走0个,也算是n份均分)。问最初这堆苹果最少有多少个。

给定一个整数n,表示熊的个数,返回最初的苹果数,保证有解。

测试样例:

2

返回:3

解题思路:

无法从后往前推,因为最后一个熊拿到的个数是不确定的,所以就使用遍历,从n+1开始,判断在每一次的加减的过程中,该数是否对n取余等于1,如果是则继续减,直到熊的个数等于0为止,否则就进入下一个数的判断。

代码如下(如果代码页面超出可以左右上下移动):

image
image

技术知识点

数据库基本知识点(下)

第四节

一、相关概念和知识点

SQL语句总结

1. SELECT:将资料从数据库中的表格内选出,两个关键字:从 (FROM) 数据库中的表格内选出 (SELECT)。

语法为:SELECT "栏位名"FROM "表格名"

2. DISTINCT:在上述 SELECT 关键词后加上一个DISTINCT 就可以去除选择出来的栏位中的重复,从而完成求得这个表格/栏位内有哪些不同的值的功能。

语法为:SELECT DISTINCT "栏位名" FROM "表格名"

3. WHERE:这个关键词可以帮助我们选择性地抓资料,而不是全取出来。语法为:SELECT "栏位名"FROM "表格名" WHERE "条件"

4. AND OR:上例中的 WHERE 指令可以被用来由表格中有条件地选取资料。这个条件可能是简单的 (像上一页的例子),也可能是复杂的。复杂条件是由二或多个简单条件透过 AND 或是 OR 的连接而成。

语法为:SELECT "栏位名" FROM "表格名" WHERE "简单条件" {[AND|OR] "简单条件"}+

5. IN:在 SQL 中,在两个情况下会用到 IN 这个指令;这一页将介绍其中之一:与WHERE 有关的那一个情况。在这个用法下,我们事先已知道至少一个我们需要的值,而我们将这些知道的值都放入IN 这个子句。

语法为:SELECT "栏位名" FROM "表格名" WHERE "栏位名"IN ('值一', '值二', ...)

6. BETWEEN:IN 这个指令可以让我们依照一或数个不连续 (discrete)的值的限制之内抓出资料库中的值,而 BETWEEN 则是让我们可以运用一个范围 (range) 内抓出资料库中的值。

语法为:SELECT "栏位名" FROM "表格名"WHERE "栏位名" BETWEEN '值一' AND '值二'

7. LIKE:LIKE 是另一个在WHERE 子句中会用到的指令。基本上, LIKE 能让我们依据一个模式(pattern) 来找出我们要的资料。

语法为:SELECT "栏位名" FROM "表格名" WHERE "栏位名"LIKE {模式}

8. ORDER BY:我们经常需要能够将抓出的资料做一个有系统的显示。这可能是由小往大(ascending) 或是由大往小(descending)。在这种情况下,我们就可以运用 ORDER BY 这个指令来达到我们的目的。

语法为:SELECT "栏位名" FROM "表格名 [WHERE"条件"] ORDER BY "栏位名" [ASC, DESC]

9. 函数:函数允许我们能够对这些数字的型态存在的行或者列做运算,包括 AVG (平均)、COUNT (计数)、MAX (最大值)、MIN (最小值)、SUM (总合)。

语法为:SELECT "函数名"("栏位名") FROM "表格名"

10. COUNT:这个关键词能够帮我我们统计有多少笔资料被选出来。

语法为:SELECT COUNT("栏位名") FROM "表格名"

11. GROUP BY:GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。

语法为:SELECT "栏位1",SUM("栏位2") FROM "表格名" GROUP BY "栏位1"

12. HAVING:该关键词可以帮助我们对函数产生的值来设定条件。

语法为:SELECT "栏位1",SUM("栏位2") FROM "表格名" GROUP BY "栏位1" HAVING (函数条件)

13. ALIAS:我们可以通过ALIAS为列名称和表名称指定别名。

语法为:SELECT "表格别名"."栏位1" "栏位别名" FROM "表格名" "表格别名"

二、举例说明SQL关键词使用方法

下面为一个例子,通过它我们应该能很好地掌握以上关键词的使用方法。

例子:

Student(S#,Sname,Sage,Ssex) 学生表

Course(C#,Cname,T#) 课程表

SC(S#,C#,score) 成绩表

Teacher(T#,Tname) 教师表

问题:

1.查询“001”课程比“002”课程成绩高的所有学生的学号;

select a.S#

from (select s#,score from SC whereC#='001') a,

(select s#,score from SC where C#='002') b

where a.score>b.score and a.s#=b.s#;

2.查询平均成绩大于60分的同学的学号和平均成绩;

select S#,avg(score)

from sc

group by S# having avg(score) >60;

3.查询所有同学的学号、姓名、选课数、总成绩;

selectStudent.S#,Student.Sname,count(SC.C#),sum(score)

from Student left Outer join SC onStudent.S#=SC.S#

group by Student.S#,Sname

4.查询姓“李”的老师的个数;

select count(distinct(Tname))

from Teacher

where Tname like '李%';

5.查询没学过“叶平”老师课的同学的学号、姓名;

select Student.S#,Student.Sname

from Student

where S# not in (select distinct( SC.S#)from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T#andTeacher.Tname='叶平');

6.查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;

select Student.S#,Student.Sname

from Student,SC

where Student.S#=SC.S# and SC.C#=’001′andexists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002');

7.查询学过“叶平”老师所教的所有课的同学的学号、姓名;

select S#,Sname

from Student

where S# in

(select S#

from SC ,Course ,Teacher

where SC.C#=Course.C# andTeacher.T#=Course.T# and Teacher.Tname=’叶平’ group by S#having count(SC.C#)=(select count(C#) from Course,Teacher whereTeacher.T#=Course.T# and Tname='叶平'));

8.查询所有课程成绩小于60分的同学的学号、姓名;

select S#,Sname

from Student

where S# not in (select Student.S# fromStudent,SC where S.S#=SC.S# and score>60);

9.查询没有学全所有课的同学的学号、姓名;

select Student.S#,Student.Sname

from Student,SC

where Student.S#=SC.S#

group by Student.S#,Student.Sname havingcount(C#) <(select count(C#) from Course);

10.查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;

select S#,Sname

from Student,SC

where Student.S#=SC.S# and C# in (select C# from SC where S#='1001');

11.删除学习“叶平”老师课的SC表记录;

Delect SC

from course,Teacher

where Course.C#=SC.C# and Course.T#=Teacher.T# and Tname='叶平';

12.查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分

SELECT L.C# 课程ID,L.score最高分,R.score 最低分

FROM SC L ,SC R

WHERE L.C# = R.C#

and

L.score = (SELECT MAX(IL.score)

FROM SC IL,Student IM

WHERE IL.C# = L.C# and IM.S#=IL.S#

GROUP BY IL.C#)

and

R.Score = (SELECT MIN(IR.score)

FROM SC IR

WHERE IR.C# = R.C#

GROUP BY IR.C# );

13.查询学生平均成绩及其名次

SELECT 1+(SELECT COUNT( distinct 平均成绩)

FROM (SELECT S#,AVG(score) 平均成绩

FROM SC

GROUP BY S# ) T1

WHERE 平均成绩 > T2.平均成绩) 名次, S# 学生学号,平均成绩

FROM (SELECT S#,AVG(score) 平均成绩 FROM SC GROUP BY S# ) T2 ORDER BY 平均成绩 desc;

14.查询各科成绩前三名的记录:(不考虑成绩并列情况)

SELECT t1.S# as 学生ID,t1.C#as 课程ID,Score as 分数

FROM SC t1

WHERE score IN (SELECT TOP 3 score

FROM SC

WHERE t1.C#= C#

ORDER BY score DESC)

ORDER BY t1.C#;

15.查询每门功成绩最好的前两名

SELECT t1.S# as 学生ID,t1.C#as 课程ID,Score as 分数

FROM SC t1

WHERE score IN (SELECT TOP 2 score

FROM SC

WHERE t1.C#= C#

ORDER BY score DESC )

ORDER BY t1.C#;

image

大厂暑期实习的招聘已到中后期,无论有没有拿到offer都不要松懈。请相信:越努力,越幸运!小伙伴们,跟着【19应届生】学习技术知识,我们一起加油吧~!

image

你可能感兴趣的:(程序员面试修炼08 | 京东2016笔试题)