- 不属于冯诺依曼体系结构必要组成部分是:
- A、CPU
- B、Cache
- C、RAM
- D、ROM
-
关于排序算法的以下说法,错误的是: - A、快速排序的平均时间复杂度O(nlogn),最坏O(N^2)
- B、堆排序平均时间复杂度O(nlogn),最坏O(nlogn)
- C、冒泡排序平均时间复杂度O(n^2),最坏O(n^2)
- D、归并排序的平均时间复杂度O(nlogn),最坏O(n^2)
-
递归式的先序遍历一个n节点,深度为d的二叉树,则需要栈空间的大小为: - A、O(n)
- B、O(d)
- C、O(logn)
- D、(nlogn)
-
用两种颜色去染排成一个圈的6个棋子,如果通过旋转得到则只算一种,一共有多少种染色: - A、10
- B、11
- C、14
- D、15
-
一个洗牌程序的功能是将n张牌的顺序打乱,以下关于洗牌程序的功能定义说法最恰当的是: - A、每张牌出现在n个位置上的概率相等
- B、每张牌出现在n个位置上的概率独立
- C、任何连续位置上的两张牌的内容独立
- D、n张牌的任何两个不同排列出现的概率相等
- 袋中有红球,黄球,白球各一个,每次任意取一个放回,如此连续3次,则下列事件中概率是8/9的是:
- A、颜色不全相同
- B、颜色全不相同
- C、颜色全相同
- D、颜色无红色
-
对于顺序存储的线性数组,访问节点和增加节点删除节点的时间复杂度为: - A、O(n),O(n)
- B、O(n),O(1)
- C、O(1),O(n)
- D、O(n),O(n)
-
对于一个具有n个顶点的无向图,若采用邻接表数据结构表示,则存放表头节点的数组大小为: - A、n
- B、n+1
- C、n-1
- D、n+边数
-
如下函数,在32bit系统foo(2^31-3)的值是:
Int foo(int x)
{
Return x&-x;
} - A、0
- B、1
- C、2
- D、4
-
下面算法的时间复杂度为:
Int f(unsigned int n)
{
If(n==0||n==1)
Return 1;
Else
Return n*f(n-1);
} - A、O(1)
- B、O(n)
- C、O(N*N)
- D、O(n!)
-
你认为可以完成编写一个C语言编译器的语言是: - A、汇编
- B、C语言
- C、VB
- D、以上全可以
-
一个栈的入栈序列式ABCDE则不可能的出栈序列是: - A、DECBA
- B、DCEBA
- C、ECDBA
- D、ABCDE
-
假设把整数关键码K散列到N个槽列表,以下哪些散列函数是好的散列函数 - A、h(K)=K/N;
- B、h(K)=1;
- C、h(K)=K mod N;
- D、h(K)=(K+rand(N)) mod N, rand(N)返回0到N-1的整数
-
下面排序算法中,初始数据集的排列顺序对算法的性能无影响的是: - A、堆排序
- B、插入排序
- C、冒泡排序
- D、快速排序
-
下面说法错误的是: - A、CISC计算机比RISC计算机指令多
- B、在指令格式中,采用扩展操作码设计方案的目的是为了保持指令字长不变而增加寻址空间
- C、增加流水线段数理论上可以提高CPU频率
- D、冯诺依曼体系结构的主要特征是存储程序的工作方式
-
考虑一个特殊的hash函数h,能将任意字符串hash成一个整数k,其概率P(k)=2^(-k),
k=1,2,…, ∞,对一个位置大小的字符串集合S中的每一个元素取hash值所组成的集合为h(S)。若h(S)中最大的元素max
h(S)=10,那么S的大小的期望是______________。 - A、1024
- B、512
- C、5
- D、10
-
在32为系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是:
Struct A
{
Int a;
short b;
int c;
char d;
};
Struct B
{
int a;
short b;
char c;
int c;
}; - A、16,16
- B、13,12
- C、16,12
- D、11,16
-
n从1开始,每个操作可以选择对n加1或者对n加倍。若想获得整数2013,最少需要多少个操作。 - A、18
- B、24
- C、21
- D、不可能
- 数为
- A、11
- B、12
- C、13
- D、14
-
假设函数rand_k会随机返回一个【1,k】之间的随机数(k>=2),并且每个证书出现的概率相等。目前有rand_7,通过调用rand_7()和四则运算符,并适当增加逻辑判断和循环控制逻辑,下列函数可以实现的有: - A、rand_3
- B、rand_21
- C、rand_23
- D、rand_49
-
两个线程运行在双核机器上,每个线程主线程如下,线程1:x=1;r1=y;线程2:y=1;r2=x;
X和y是全局变量,初始为0。以下哪一个是r1和r2的可能值: - A、r1=1,r2=1
- B、r1=1,r2=0
- C、r1=0,r2=0
- D、r1=0,r2=1
-
关于Linux系统的负载,以下表述正确的是: - A、通过就绪和运行的进程数来反映
- B、通过TOP命令查看
- C、通过uptime查看
- D、Load:2.5,1.3,1.1表示系统的负载压力在逐渐变小
-
某进程在运行过程中需要等待从磁盘上读入数据,此时进程的状态将: - A、从就绪变为运行
- B、从运行变为就绪
- C、从运行变为阻塞
- D、从阻塞变为就绪
- 关于C++/JAVA类中的static成员和对象成员的说法正确的是:
- A、static成员变量在对象构造时候生成
- B、static成员函数在对象成员函数中无法调用
- C、虚成员函数不可能是static成员函数
- D、static成员函数不能访问static成员变量
如下函数,在32bit系统foo(2^31-3)的值是:
Int foo(int x)
{
Return x&-x;
}
这一题:首先2^31-3,存在优先级的问题,那个^是异或,小于-号优先级,
所以2^28 11100 ^ 10 11110 =30
然后X&-x的作用就是:
等于2^p (p: x的二进制表示数中, 右向左数第一个1的位置);
如6的二进制表示为110,向左数第零个为0,第一个为1,则p=1,故Lowbit(6) = 2^1 = 2。
30 为11110 ,第一个1的位置是1 ,所以2^1 = 2
1给定一个排好序的数组,从里面查找一个给定值出现的次数
用hash处理,遍历一遍,如果数比较大,用map<int,int>,if(mm.count(a[i]));
2是如何实现一个栈,同时可以返回栈中最大值。
用两个栈 实现;同最小栈;
1给了他简历,他没让我自我介绍,首先问了我下笔试感觉答的怎么样,我说除了选择中的概率题目其他选择题没问题,大题做的不太好,
2 熟悉哪些数据结构,我说从顺序表、链表、栈、队列、树、堆都有了解,他接着问顺序表和链式表有什么区别,
顺序表存储位置是相邻连续的,可以随即访问的一种数据结构,一个顺序表在使用前必须指定起长度,一旦分配内存,则在使用中不可以动态的更改。
他的优点是访问数据是比较方便,可以随即的访问表中的任何一个数据。
链表是通过指针来描述元素关系的一种数据结构,他可以是物理地址不连续的物理空间。不能随即访问链表元素,必须从表头开始,一步一步搜索元素。
它的优点是:对于数组,可以动态的改变数据的长度,分配物理空间。
3 C++为什么要继承
定义新类,没有继承,面向对象方法也就不存在,有了继承,才呈现丰富多彩的类
1、类继承是在编译时刻静态定义的,且可直接使用,
2、类继承可以较方便地改变父类的实现。
通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。
4 多态,然后问我多态是怎么实现的
一个接口,多种方法,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念
C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写
封装可以使得代码模块化,继承可以扩展已存在的代码,他们的目的都是为了代码重用。
而多态的目的则是为了接口重用。也就是说,不论传递过来的究竟是那个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。
C++纯虚函数
纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”
virtual void funtion()=0
编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。
1、多态性
指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。
a、编译时多态性:通过重载函数实现
b、运行时多态性:通过虚函数实现。
2、虚函数
虚函数是在基类中被声明为virtual,并在派生类中重新定义的成员函数,可实现成员函数的动态覆盖(Override)
3、抽象类
包含纯虚函数的类称为抽象类。由于抽象类包含了没有定义的纯虚函数,所以不能定义抽象类的对象。
5三个类A、B、C,B、C均继承自A,均有虚函数f,然后定义了3个指针,让我画下虚表
虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。
在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。
这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中。
见图片;
一般继承(无虚函数覆盖)
一般继承(有虚函数覆盖)
多重继承(无虚函数覆盖)
多重继承(有虚函数覆盖)
6 程序运行都有哪些内存空间,我说当然是栈、堆、全局、代码段,然后他问虚表应该放在哪,
1.bss段
该段用来存放没有被初始化或初始化为0的全局变量,因为是全局变量,所以在程序运行的整个生命周期内都存在于内存中。
2.data段
初始化过的全局变量数据段,该段用来保存初始化了的非0的全局变量,如果全局变量初始化为0,则编译有时会出于优化的考虑,将其放在bss段中。因为也是全局变量,所以在程序运行的整个生命周期内都存在于内存中。与bss段不同的是,data段中的变量既占程序运行时的内存空间,也占程序文件的储存空间。
3.rodata段
该段是常量数据段,用于存放常量数据,ro就是Read Only之意。但是注意并不是所有的常量都是放在常量数据段的,其特殊情况如下:
1)有些立即数与指令编译在一起直接放在代码段(text段,下面会讲到)中。
2)对于字符串常量,编译器会去掉重复的常量,让程序的每个字符串常量只有一份。
3)有些系统中rodata段是多个进程共享的,目的是为了提高空间的利用率。
4.text段
text段就是代码段,用来存放程序的代码(如函数)和部分整数常量。它与rodata段的主要不同是,text段是可以执行的,而且不被不同的进程共享。
5.stack段
该段就是栈段,用来保存临时变量和函数参数。程序中的函数调用就是以栈的方式来实现的,通常栈是向下(即向低地址)增长的,当向栈中push一个元素,栈顶指针就会向低地址移动,当从栈中pop一个元素,栈顶指针就会向高地址移动。
6.heap段
heap(堆)是最自由的一种内存,它完全由程序来负责内存的管理,包括什么时候申请,什么时候释放,而且对它的使用也没有什么大小的限制。
虚表是放在rdata,虚表也是运行时不变的
8智能指针,他问我auto_ptr与shared_ptr的不同
智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象。
每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;
对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;
调用析构函数时,析构函数减少引用计数(如果引用计数减至0,则删除基础对象)。
auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理
1、auto_ptr不能共享所有权。
2、auto_ptr不能指向数组
3、auto_ptr不能作为容器的成员。
4、不能通过赋值操作来初始化auto_ptr
5、不要把auto_ptr放入容器
scoped_ptr 简单的单一对象的唯一所有权。不可拷贝。
scoped_array 简单的数组的唯一所有权。不可拷贝。
shared_ptr 在多个指针间共享的对象所有权。
shared_array <在多个指针间共享的数组所有权。
weak_ptr <一个属于 shared_ptr 的对象的无所有权的观察者。
intrusive_ptr 带有一个侵入式引用计数的对象的共享所有权。
shared_ptr就是为了解决auto_ptr在对象所有权上的局限性(auto_ptr是独占的),在使用引用计数的机制上提供了可以共享所有权的智能指针.
2. shared_ptr比auto_ptr更安全
3. shared_ptr是可以拷贝和赋值的,拷贝行为也是等价的,并且可以被比较,这意味这它可被放入标准库的一般容器(vector,list)和关联容器中(map)
9提问题:java很多,C++的很少
1项目中涉及到的多线程,居然又问到了线程和进程的区别
一个进程可以有多个线程,但一个线程总是属于唯一的进程。两个进程不能共享内存空间,除非它们有意通过共享内存进行进程间通信。但是同一进程的两个线程总是共享相同的内存。
2实现下boost里面的shared_ptr,线程不安全,问我如何解决线程安全,我说对引用计数操作加锁,
shared_ptr不用手动去释放资源,它会智能地在合适的时候去自动释放
boost::shared_ptr的实现机制其实比较简单,就是对指针引用的对象进行引用计数,当有一个新的boost::shared_ptr指针指向一个对象时,就把该对象的引用计数加1,减少一个boost::shared_ptr指针指向一个对象时,就把对该对象的引用计数减1。当一个对象的引用计数变为0时,就会自动调用其析构函数或者free掉相应的空间。
实现:看图片
1 同一个shared_ptr对象可以被多线程读
2 多个shared_ptr对象、但指向同一raw_pointer的, shared_ptr本身可以被多线程读写; 但是底层指针指向的对象的多线程安全性无任何保证。
3 多线程同时读写同一个shared_ptr对象时, 使用atomic_load/store/exchange, 这些函数见smart_ptr/shared_ptr.hpp。 否则是不安全的。
然后唐要我写下线程安全的shared_ptr的reset成员函数,唐在这他提示我当引用计数到0后,析够是在锁外还在锁内,然后他又问我加锁的代价,
pthread_create创建线程
3以后打算做那个方向
面试不能太诚实啊,不能暴露太多缺点
1、自我介绍
2、会不会linux的基本命令 例如ls/cd/pwd之类的吗
常用指令
ls 显示文件或目录
mkdir 创建目录
cd 切换目录
touch 创建空文件
echo 创建带有内容的文件。
cat 查看文件内容
cp 拷贝
mv 移动或重命名
rm 删除文件
find 在文件系统中搜索某文件
wc 统计文本中行数、字数、字符数
grep 在文本文件中查找某个字符串
rmdir 删除空目录
tree 树形结构显示目录,需要安装tree包
pwd 显示当前目录
ln 创建链接文件
ctrl+alt+F1 命令行全屏模式
系统管理命令
stat 显示指定文件的详细信息,比ls更详
hostname 显示主机名
uname 显示系统信息
ifconfig 查看网络情况
ping 测试网络连通
netstat 显示网络状态信息
man man命令用来提供在线帮助,使用权限是所有用户
clear 清屏
kill 杀死进程,可以先用ps 或 top命令查看进程的id,然后再用kill命令杀死进程。
打包压缩相关命令
gzip:
bzip2:
tar: 打包压缩
shutdown
-r 关机重启
-h 关机不重启
now 立刻关机
halt 关机
reboot 重启
dpkg (Debian Package)管理工具,软件包名以.deb后缀。这种方法适合系统不能联网的情况下。
sudo dpkg -i tree_1.5.3-1_i386.deb 安装软件
sudo dpkg -r tree 卸载软件
sudo apt-get install tree 安装tree
sudo apt-get remove tree 卸载tree
sudo apt-get update 更新软件
sudo apt-get upgrade
vim使用
vim三种模式:命令模式、插入模式、编辑模式。使用ESC或i或:来切换模式。
命令模式下:
:q 退出
:q! 强制退出
:wq 保存并退出
:set number 显示行号
:set nonumber 隐藏行号
用户及用户组管理
/etc/passwd 存储用户账号
/etc/group 存储组账号
/etc/shadow 存储用户账号的密码
/etc/gshadow 存储用户组账号的密码
passwd root 给root设置密码
su root
su - root
/etc/profile 系统环境变量
bash_profile 用户环境变量
.bashrc 用户环境变量
su user 切换用户,加载配置文件.bashrc
su - user 切换用户,加载配置文件/etc/profile ,加载bash_profile
三种基本权限
R 读 数值表示为4
W 写 数值表示为2
X 可执行 数值表示为1
更改权限
sudo chmod [u所属用户 g所属组 o其他用户 a所有用户] [+增加权限 -减少权限] [r w x] 目录名
3、之前做过的项目,你主要负责什么?
4、你有什么问题么?
我们现在部门是怎样的,对以后项目是怎样规划的
5、你自己写过什么程序么
BFS等
1、C#,JAVA和C/C++的区别是什么
C是面向过程语言 C++具备了面向对象 JAVA是完全的面向对象 Java是一种可以编写跨平台应用软件的面向对象的程序设计语言
(1)C#、Java代码编译后(形成中间代码)是在虚拟机上执行的。C++则不是。
(2)C#、Java语言相对于C++语言来说较为简单,比较容易上手。C++的语法特性多、复杂,较难掌握。
(3)C++语言本身是一个标准,各种实现之间有区别,对标准的理解、执行程度也不同。而C#、Java语言是由商业公司掌握的,在这方面很少有问题。
(4)C#、Java是直接面向应用的,各种标准、模型都很成熟。而C++的各种库在不同的C++编译器实现上可能遇到一些问题。
(5)三者都是面向对象的。C#、Java比C++更为彻底一些。有观点认为C#、Java是彻底地面向对象的语言,这种说法不妥,因为对于面向对象的语言,并没有一个特定的标准,例如也有观点认为最近很流行的Ruby语言比C#、Java更加面向对象。
2、C++中的指针和引用,java中的异常处理,C++的指针和引用
java中所有不正常类都继承于Throwable
Throwable有两个子类,一个是Error,一个是Exception.
Error的出现有两种情况 一种是:虚拟机错误,一种是线程死锁ThreadDeath
Error出现是硬伤,系统问题。
而Exception 的出现则是因为你的编码,环境,或者操作输入出现了问题。
Exception有很多子类
一种是RuntimeException(非检查异常),其他的异常则是(检查异常)
1、指针和引用的区别?
答:引用是在C++中引入的。它们之间的区别有:
(1) 非空区别:指针可以为空,而引用不能为空
(2) 可修改区别:如果指针不是常指针,那么就可以修改指向,而引用不能
(3) 初始化区别:指针在定义时可以不用初始化,而引用在定义的同时必须初始化
1、mvc、工厂、单例、蝇量。。然后继续问什么地方用到了mvc啊、工厂啊,说具体实例、
Singleton模式,通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
线程安全的 懒汉模式
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。因为工厂模式就相当于创建实例对象的new,
我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
工厂类角色:是具体产品类角色直接调用者。
抽象产品角色:接口或抽象类,负责具体产品角色的定义,及与客户端的交互。
具体产品角色:被工厂类创建的对象,也是客户端实际操作对象。
客户端:调用工厂类产生实例,并调用实例的方法进行相应工作。
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,
用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,
不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
优点:
耦合性低
视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。
重用性高:因为多个视图能共享一个模型
生命周期成本低:MVC使开发和维护用户接口的技术含量降低。
部署快:使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。
可维护性高:分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。
有利软件工程化管理:由于不同的层各司其职,每一层不同的应用具有某些相同的特征,
应用于游戏
2、数据库,我说用mysql多一点。就问用什么存储引擎,数据库事务,对事务的理解
MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:常用的是MyISAM和InnoBD
MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。
InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或禁止任一引擎。
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
原子性、一致性、隔离性和持久性
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行
事务在完成时,必须使所有的数据都保持一致状态
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离
事务完成之后,它对于系统的影响是永久性的。
招收需要什么能力:1.基础功扎实,因为需要长期发展需要底层的知识积累。2是热情。3是个人项目或者比赛名次。
问题1:
---------------一面问题--------------------
冒泡排序和快速排序的时间复杂度和空间复杂度
排序法 最差时间分析 平均时间复杂度稳定度空间复杂度
冒泡排序 O(n2) O(n2) 稳定 O(1)
快速排序 O(n2) O(n*log2n) 不稳定O(log2n)~O(n)
选择排序 O(n2) O(n2) 稳定 O(1)
二叉树排序 O(n2) O(n*log2n) 不一顶O(n)
插入排序 O(n2) O(n2)稳定O(1)
堆排序 O(n*log2n)O(n*log2n)不稳定O(1)
希尔排序 O O 不稳定 O(1)
软件的设计模式(我说的MVC,优点和应用场景)
装箱和封箱(get,set是什么原理)
数据库有什么索引
索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。
唯一索引、主键索引和聚集索引。在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。
SQL语句create,alter table change 列名 新列名 数据类型,drop
tcp协议和udp协议的差别
TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。
UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。
IP网际协议 TCP和UDP是运行在传输层的主要协议传输控制协议TCP 是面向有连接的用户数据报协议UDP 是面向无连接的 IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。
IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)
TCP支持的应用协议:Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传输协议)。TCP用于传输数据量大,可靠性要求高的应用。
UDP支持的应用协议:NFS(网络文件系统)、SNMP(简单网络管理系统)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。
项目负责的工作、问题和总结
淘点点等类似网站的评价和建议
手机APP的改进(淘宝电影)
对编程语言的学习有何选择偏向
最近在看什么书
---------------------二面问题----------------
C++的优势与缺陷介绍
1、 C++实现了面向对象程序设计。在高级语言当中,处理运行速度是最快的,大部分的游戏软件,系统都是由C++来编写的。
2、 C++语言非常灵活,功能非常强大。如果说C语言的优点是指针,那么C++的优点就是性能和类层次结构的设计。
3、C++非常严谨、精确和数理化,标准定义很细致。
4、 C++语言的语法思路层次分明、相呼应;语法结构是显式的、明确的。
C++两个关键缺陷
即语言的过度复杂和标准库的过度苍白。
C++语言过于复杂在业界是共识。
C++语言已经无法简化,如果编译器能够提供可定制编译也许对这个语言会有帮助。
C++语言功能是很强大的,其运行效率也一度得到很多人的肯定,
OC缺点
缺点:
1) 不支援命名空間
2) 不支持运算符重载
3) 不支持多重继承
4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。
siwift优缺点
Swift意味“迅速、敏捷”,正如它的名字一样,它能加快应用程序的开发速度,同Objective-C、C语言更好地协作。
同时,Swift和脚本语言一样,非常富有表现力,能让人们更自然地对它进行阅读和编写。
Swift还拥有自动内存管理功能
Swift并不具备开放标准
错误警告和内存管理功能提出质疑
1、简洁(不是说语法体系简洁,而是书写)
2、结合playground,做到真正意义上的所见即所得
3、便于扩展(能桥接ObjC)
4、还有直接支持闭包。你想在哪儿定义函数就在哪儿定义。
5、而且既能面向过程,又能面向对象,还能来个函数式编程风格
没学过JAVA,你为啥不学?
C#使用以来最大的问题(印象最深的问题)
算法问题:10万首歌推荐一首,每首歌有评分,评分越高被推荐的概率越高。(按照概率映射成一个连续数字序列,然后随机函数从中选数,某个数据范围内对应一首歌),①,1;②,2;③,3----1, 2,3, 4,5,6
你的研究方向是什么?
知道淘点点是干甚的?(简述、类似软件,开发建议)
你想做业务研发还是算法
实习前,JAVA能够学到什么程度(JAVA的后台WEB架构,求推荐需要用到的技术和框架)
实习两个月以上可以吗?【二面要过的节奏啊,我就挂在三面了】
--------------------三面问题-------------
本科到研究生做的项目
简历上的项目中重构工作的要点
重构如何保证质量
项目的测试,有无单元测试,专门的测试人员
研究方向是什么
数据挖掘做过的项目
struct和class的区别
TCP握手和挥手的区别,挥手的次数
堆和栈的区别
问题1:
python多进程的问题
回 答:
就是进程通信的问题,把linux能通信的几个方法都说一遍就行了
管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
1、在一篇文章中查找单词的数量,说说算法,用java如何实现,这个代码其实我上学期自己用c语言编程过,紧张支支吾吾说了下怎么解,感觉说的很不好。
2、问了链表的结构分类,优缺点什么的,这个我知道,感觉回答的还行。
3、问了哈希表是怎么样的,二叉树,完全二叉树什么的
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
完全二叉树:除最后一层外,每一层上的节点数均达到最大值;在最后一层上只缺少右边的若干结点。
满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。
4、问了单链表的中心对称怎么判断,这个蒙了,让面试官解释了下,但自己瞎说了一下,然就感觉不对,就问别的了
新生成一个原链表的逆链表,再来比较,是否相等,若是则中心对称。
也可以把所有的结点压入栈,然后,再依次弹出比较
5、问了面向对象和接口是怎么样的,这个也忘了,呜呜
封装 继承多态;可维护 可复用 可扩展 灵活性好
抽象类,使部分抽象,它是可以带有一些有方法体的方法的
接口,的所有方法都是抽象的
抽象类是模板,接口是规范
6、然后问了网络的问题,TCP ip什么的,我说不知道,然后就问了,http,cookie什么的,我也是支支吾吾,忘了
7、然后问了数据库的知识,问了一些,具体不太记得了,就是感觉很简答的那种,我也忘了,呜呜
8、之后问了些自己的兴趣爱好,看过什么技术类的书籍,我就说了一些,喜爱运动,看过什么什么书啥的
9、问了spring什么,我记不起来了
malloc和new的区别
代码运行时在内存中的分布,就是堆、栈、代码区、静态区那几个,各自是存什么的就行了
进程和线程的区别,
链表怎么判断有没有环路
你为什么选择阿里巴巴,将来有什么打算,怎么样学习。
当你访问淘宝网时,后台整个的运行机制你是怎么理解的。
回 答:
首先访问域名服务器,通过域名服务器跳转到相应的IP地址,访问网页存储的服务器端,服务器返回信息,浏览器组织成用户可以看到的网页。
c语言的内存分哪几种,malloc函数申请的哪种。
回 答:
堆内存,栈内存,全局变量等,申请的是堆内存,空间比较大。
一.自我介绍
1. 讲一下最近在做的一个项目
数组怎么哈希?
链表用来存什么?
TreeMap怎么实现的?
Mysql索引是如何实现的?
添加PRIMARY KEY(主键索引)
mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(唯一索引)
mysql>ALTER TABLE `table_name` ADD UNIQUE ( `column` )
3.添加INDEX(普通索引)
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文索引)
mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加多列索引
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
栈是线程共享的吗?存放什么?
堆是线程共享的吗?存放什么?
在Windows,每个线程各自拥有自己的堆栈,且线程的堆栈式不可共享的!这是由Windows线程模型决定的,用户不可改变。
线程共享堆,独自拥有一个栈咯
四.闲聊
1. 职业规划是什么?
看看自己的技术发展之路,哪些走的比较踏实,哪些走的比较急促;哪些是自己的技术特长,哪些是自己的 技术薄弱环节。;
程序员上升空间在于技术上的反思和提高。
项目经理还是架构师
五.HR
1. 兴趣爱好是神马?
2. 举办过神马活动?
3. 项目经验中,从研发工程师到主要负责人,有哪些转变?
4. 项目中遇到难题怎么解决的?
这里不是问技术,是问途径。看书,搜索,看博客,还是问同事?
4. 对阿里企业文化的理解?
open
5. 职业规划?
期望的工作地点?
六.你有什么问题?
1. 如果能实习的话,部门怎么分配?
2. 北京有哪些部门?
如下函数,在32bit系统foo(2^31-3)的值是:
Int foo(int x)
{
Return x&-x;
}