互联网公司笔试错题集锦

来源:互联网 发布:软件版权信息 编辑:程序博客网 时间:2024/06/06 05:13

Linux:

  • ctrl z 就是挂起一个进程,暂停的意思
  • fg是将进程放到前台并唤醒
  • bg是将进程放到后台并唤醒
  • ctrl+h,在shell就是向左删除的作用

Watch

  • VC支持查看变量、表达式和内存的值。所有这些观察都必须是在断点中断的情况下进行。
  • 观看变量的值最简单,当断点到达时,把光标移动到这个变量上,停留一会就可以看到变量的值。
  • VC提供一种被成为Watch的机制来观看变量和表达式的值。在断点状态下,在变量上单击右键,选择Quick Watch, 就弹出一个对话框,显示这个变量的值。 单击Debug工具条上的Watch按钮,就出现一个Watch视图(Watch1,Watch2,Watch3,Watch4),在该视图中输入变量或者表达式,就可以观察 变量或者表达式的值。注意:这个表达式不能有副作用,例如++运算符绝对禁止用于这个表达式中,因为这个运算符将修改变量的值,导致 软件的逻辑被破坏。
  • Memory
    由于指针指向的数组,Watch只能显示第一个元素的值。为了显示数组的后续内容,或者要显示一片内存的内容,可以使用memory功能。在Debug工具条上点memory按钮,就弹出一个对话框,在其中输入地址,就可以显示该地址指向的内存的内容。
  • Varibles
    Debug工具条上的Varibles按钮弹出一个框,显示所有当前执行上下文中可见的变量的值。特别是当前指令涉及的变量,以红色显示。
  • 寄存器
    Debug工具条上的Reigsters按钮弹出一个框,显示当前的所有寄存器的值。

VC:

  • Watch
    VC支持查看变量、表达式和内存的值。所有这些观察都必须是在断点中断的情况下进行。
    观看变量的值最简单,当断点到达时,把光标移动到这个变量上,停留一会就可以看到变量的值。
    VC提供一种被成为Watch的机制来观看变量和表达式的值。在断点状态下,在变量上单击右键,选择Quick Watch, 就弹出一个对话框,显示这个变量的值。
    单击Debug工具条上的Watch按钮,就出现一个Watch视图(Watch1,Watch2,Watch3,Watch4),在该视图中输入变量或者表达式,就可以观察 变量或者表达式的值。注意:这个表达式不能有副作用,例如++运算符绝对禁止用于这个表达式中,因为这个运算符将修改变量的值,导致 软件的逻辑被破坏。
  • Memory
    由于指针指向的数组,Watch只能显示第一个元素的值。为了显示数组的后续内容,或者要显示一片内存的内容,可以使用memory功能。在Debug工具条上点memory按钮,就弹出一个对话框,在其中输入地址,就可以显示该地址指向的内存的内容。
  • Varibles
    Debug工具条上的Varibles按钮弹出一个框,显示所有当前执行上下文中可见的变量的值。特别是当前指令涉及的变量,以红色显示。
  • 寄存器
    Debug工具条上的Reigsters按钮弹出一个框,显示当前的所有寄存器的值。

Sql:

  • where子句对被选择的列施加条件,
  • having子句对group by子句所产生的组施加条件。
  • select之后如果是聚合函数则group by 分组会显示null的结果,而order by不会显示null的结果

区分一下两个概念:

  • 平均等待时间:将所有作业的运行时间加起来除以总的作业数 (1+3+5+7)/4=4
  • 平均周转时间:将所有作业运行的时间和等待的时间全部加起来除以作业数,这四个作业的等待时间分别是:0,1,4,9
    (1+3+5+7+0+1+4+9)/4=7.5

MySQL数据库中,变量分为 系统变量(以”@@”开头)和用户自定义变量。系统变量分为全局系统变量(global)和会话系统变量(session)。

  • @@global 仅用于访问全局系统变量的值;
  • @@session 仅用于访问会话系统变量的值;
  • @@ 先访问会话系统变量的值,若不存在则去访问全局系统变量的值;
  • sql_mode 为系统变量,既是全局系统变量,又是会话系统变量。

总结
- a、设置方法
要想设置一个GLOBAL变量的值,使用下面的语法:
mysql> SET GLOBAL sort_buffer_size=value;
mysql> SET @@global.sort_buffer_size=value;

要想设置一个SESSION变量的值,使用下面的语法:   mysql> SET SESSION sort_buffer_size=value;   mysql> SET @@session.sort_buffer_size=value;   mysql> SET sort_buffer_size=value;   LOCAL是SESSION的同义词。如果设置变量时不指定GLOBAL、SESSION或者LOCAL,默认使用SESSION。

- b、检索设置
要想检索一个GLOBAL变量的值,使用下面的语法:
mysql> SELECT @@global.sort_buffer_size;
mysql> SHOW GLOBAL VARIABLES like ‘sort_buffer_size’;

要想检索一个SESSION变量的值,使用下面的语法:   mysql> SELECT @@sort_buffer_size;   mysql> SELECT @@session.sort_buffer_size;   mysql> SHOW SESSION VARIABLES like 'sort_buffer_size';这里,LOCAL也是SESSION的同义词。

- c、其他注意事项
当你用SELECT @@var_name搜索一个变量时(也就是说,不指定global.、session.或者local.),
MySQL返回SESSION值(如果存在),否则返回GLOBAL值。
对于SHOW VARIABLES,如果不指定GLOBAL、SESSION或者LOCAL,MySQL返回SESSION值。


服务器端:socket()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。客户端:socket()建立套接字,连接(connect)服务器,连接上后使用send()和recv(),在套接字上写读数据,直至数据交换完毕,close socket()关闭套接字。服务器端:accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连接。该新产生的套接字使用send()和recv()写读数据,直至数据交换完毕,close socket()关闭套接字。
关于socket通信的面试题 :链接


  • 丢失修改
    下面我们先来看一个例子,说明并发操作带来的数据的不一致性问题。
    考虑飞机订票系统中的一个活动序列:
    甲售票点(甲事务)读出某航班的机票余额A,设A=16.
    乙售票点(乙事务)读出同一航班的机票余额A,也为16.
    甲售票点卖出一张机票,修改余额A←A-1.所以A为15,把A写回数据库.
    乙售票点也卖出一张机票,修改余额A←A-1.所以A为15,把A写回数据库.
    结果明明卖出两张机票,数据库中机票余额只减少1。
    归纳起来就是:两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。前文(2.1.4数据删除与更新)中提到的问题及解决办法往往是针对此类并发问题的。但仍然有几类问题通过上面的方法解决不了,那就是:
    • 不可重复读
      不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。具体地讲,不可重复读包括三种情况:
      事务T1读取某一数据后,事务T2对其做了修改,当事务1再次读该数据时,得到与前一次不同的值。例如,T1读取B=100进行运算,T2读取同一数据B,对其进行修改后将B=200写回数据库。T1为了对读取值校对重读B,B已为200,与第一次读取值不一致。
      事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神密地消失了。
      事务T1按一定条件从数据库中读取某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。(这也叫做幻影读)
  • 读”脏”数据
    读”脏”数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤消,这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据就为”脏”数据,即不正确的数据。
    产生上述三类数据不一致性的主要原因是并发操作破坏了事务的隔离性。并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其它事务的干扰,从而避免造成数据的不一致性。

与Mysql服务器相互作用的通讯协议包括TCP/IP,Socket,共享内存,命名管道


文字设定法

chmod [who] [+ | - | =] [mode] 文件名¼
Linux 文件权限设定
- u 表示“用户(user)”,即文件或目录的所有者。
- g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
- o 表示“其他(others)用户”。
- a 表示“所有(all)用户”。它是系统默认值。

操作符号可以是:
- +添加某个权限。
- -取消某个权限。
- = 赋予给定权限并取消其他所有权限(如果有的话)。

数字设定法的一般形式为:
chmod [mode] 文件名¼

  我们必须首先了解用数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。所以       数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o)。 

例如,如果想让某个文件的属主有“读/写”二种权限,需要把4(可读)+2(可写)=6(读/写)。
增加用户:
useradd -u 0 -o admin
- -u 用户号 指定用户的用户号;因为系统用户的用户号为0,故指定用户号为0 如果同时有-o选项,则可以重复使用其他用户的标识号;因为系统本身存在用户号为0的系统用户,故应该使用该参数。
- u表示创建用户.g表示创建用户组 -e指定账号的有效期限,缺省表示永久有效。
- -f指定在密码过期后多少天即关闭该账号。-p表示创建密码,-o参数允许创建相同id的用户

MYSQL知识:

@表示声明一个局部变量,@@表示声明一个全局变量(比如已经定义好的系统变量)

申明局部变量语法:declare @变量名 数据类型;例如:declare @num int;
赋值:有两种方法式(@num为变量名,value为值)
set @num=value; 或 select @num=value;

C++规定,有的运算符(如赋值运算符、下标运算符、函数调用运算符)必须定义为类的成员函数,有的运算符则不能定义为类的成员函数(如流插入“<<”和流提取运算符“>>”、类型转换运算符)。
- 1、表的主键、外键必须有索引;
- 2、数据量超过300的表应该有索引;
- 3、经常与其他表进行连接的表,在连接字段上应该建立索引;
- 4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
- 5、索引应该建在选择性高的字段上;
- 6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
- 7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
- A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
- B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
- C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
- D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
- E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
- 8、频繁进行数据操作的表,不要建立太多的索引;
- 9、删除无用的索引,避免对执行计划造成负面影响;


内存按字节编址,地址区间为[90000H,CFFFFH],若用32K*8bit的存储器芯片构成该内存,需要__块?

首先根据地址区间[90000H,CFFFFH],可以计算地址空间为:CFFFFH - 90000H + 1 = 40000H
因为10000H = 2^16B 那么 40000H = 4 * (2^16)B
(2)32K = 32*(2^10)B
那么内存所需芯片数为: ( 4 * (2^16) )/ 32*(2^10 ) = 8;


Nagle算法主要是用来避免大量的小数据包在网络中传输,从而降低网络容量利用率。 但是对于一些需要小包场景的程序,比如像telnet或ssh这样的交互性比较强的程序,你需要关闭这个算法。可以在Socket设置TCP_NODELAY选项来关闭这个算法。


格式:sync
强制将内存中的文件缓冲内容写到磁盘。
sync - flush file system buffers


二分法求中间值
//使用(low+high)/2会有整数溢出的问题
//(问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时,
//这样,产生溢出后再/2是不会产生正确结果的,而low+((high-low)/2)不存在这个问题


X&(x-1) 代表的是x转化成二进制后包含1的数量,操作一次消除一个1
For(a=0,x=0;a<=1 && !x++; ) 这一类顺序为:
1. 顺序判断中间的条件,发现不符合就停止判断。在这如果a不符合,后面的x++就不会执行。
1. 判断的时候只判断!X,判断完了,再执行x++。两者不是一个过程。
1. ++号不影响正常的其他操作,只是在执行完后再进行++操作。++在前就首先执行++
1. Printf从右到左进行运算


  • int i;
  • int *a = &i;//这里a是一个指针,它指向变量i
  • int &b = i;//这里b是一个引用,它是变量i的引用,引用是什么?它的本质是什么?下面会具体讲述
  • int * &c = a;//这里c是一个引用,它是指针a的引用
  • int & *d;//这里d是一个指针,它指向引用,但引用不是实体,所以这是错误的
  • (int&)a:将a的引用强制转换为整型,意思是a所在的内存,本来定义的时候为float类型, 并初始为1.0f,但现在我要按int类型解释这段内存(也就是说a所在的内存地址中的数据 本来是按float型存储表示的,你非要按int型来解释不可

const的用法大致可分为以下几个方面:
- (1)const修饰基本数据类型
- (2)const应用到函数中
- (3)const在类中的用法
- (4)const修饰类对象,定义常量对象


  • const int* a = & [1] //非常量数据的常量指针 指针常量
  • int const *a = & [2] //非常量数据的常量指针 a is a pointer to the constant char variable
  • int* const a = & [3] //常量数据的非常量指针指针常量 常量指针 a is a constant pointer to the (non-constant) char variable
  • const int* const a = & [4] //常量数据的常量指针

对const成员变量的初始化,不能在变量声明的地方,必须在类的构造函数的初始化列表中完成,即使是在构造函数内部赋值也是不行的。


#include<iostream.h> class Year{ private: int y; public: static int const Inity;public:  Year() {  y=Inity; } };int const Year::Inity=1997;//静态变量的赋值方法,注意必须放在类外定义void main(){ cout<<Year.Inity<<endl;//注意调用方式,这里是用类名调用的。}

常量对象只能调用常量函数,别的成员函数都不能调用。


三种继承方式:

  • Public成员 根据继承的等级改变而改变
  • Private成员 无法继承,只能通过基类的接口访问
  • Protect成员 根据继承的等级改变而改变,比自己小的默认不变

在没有虚函数的情况下,类指针调用函数是注意:

  • 1如果以一个基类指针指向派生类对象,那么经由该指针只能调用基类所定义的函数
  • 2如果你以一个派生类的指针指向一个基类对象,你必须先做明显的强制转换,但是这样做很危险
  • 3如果基类和派生类都定义了相同名的成员函数,那么通过对象指针调用成员函数时候,调用的函数是由指针的原始类型而定,而不是看指针指向的对象的类型而定

  • A a;16

  • A:: show2();
  • A:: show(); //错误,因为 A:: 后只能跟静态成员方法
  • a.show();
  • a.show2();

char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,
// 和一个字符变量;
以下则可行:
typedef char* PCHAR;
PCHAR pa, pb;
a是一个数组名,也就是数组的首地址。
对a进行取地址运算符,得到的是一个指向数组的指针!!!!这句话尤为重要!


malloc/free与new/delete的区别



0 0
原创粉丝点击