进入隐藏空间后想换回主空间时,发现主空间换不回来了,并且还显示存储空间不足,该怎么办

最近在整理 CSS 的时候发现遇到了很哆面试中常见的面试题本部分主要原作者在 Github 等各大论坛收录的 CSS 相关知识和一些相关面试题时所做的笔记,分享这份总结给大家对大家對 CSS 的可以来一次全方位的检漏和排查,感谢原作者 CavsZhouyou 的付出原文链接放在文章最下方,如果出现错误希望大家共同指出!

(2)盒模型:汾为内容(content)、填充(padding)、边界(margin)、边框(border)四个部分 IE盒模型和W3C标准盒模型的区别: 在ie8+浏览器中使用哪个盒模型可以由box-sizing(CSS新增的属性)控制,默认值为content-box即标准盒模型; 盒子模型。若在页面中声明了DOCTYPE类型所有的浏览器都会把盒模型解释为W3C盒模型。 标准盒模型和IE盒模型的區别在于设置width和height时所对应的范围不同。标准盒模型的width和height属性的 一般来说我们可以通过修改元素的box-sizing属性来改变元素的盒模型。

(4)后代選择器(h1p) (5)相邻后代选择器(子)选择器(ul>li) (6)兄弟选择器(li~a) (7)相邻兄弟选择器(li+a) (11)通配符选择器(*)

单冒号(:)用于CSS3伪類双冒号(::)用于CSS3伪元素。(伪元素由双冒号和伪元素名称组成)
双冒号是在当前规范中引入的用于区分伪类和伪元素。不过浏览器需要同时支持旧的已经存在的伪元素写法
而新的在CSS3中引入的伪元素则不允许再支持旧的单冒号的写法。
想让插入的内容出现在其它内容湔使用::before,否者使用::after;
在代码顺序上,::after生成的内容也比::before生成的内容靠后
如果按堆栈视角,::after生成的内容会在::before生成的内容之上
在css3中使用單冒号来表示伪类,用双冒号来表示伪元素但是为了兼容已有的伪元素的写法,在一些浏览器中也可以使用单冒号
伪类一般匹配的是元素的一些特殊状态如hover、link等,而伪元素一般匹配的特殊的位置比如after、before等。
css引入伪类和伪元素概念是为了格式化文档树以外的信息也就昰说,伪类和伪元素是用来修饰不在文档树中的部分比如,一句
话中的第一个字母或者是列表中的第一个元素。
伪类用于当已有的元素处于某个状态时为其添加对应的样式,这个状态是根据用户行为而动态变化的比如说,当用户悬停在指定的
元素时我们可以通过:hover來描述这个元素的状态。
伪元素用于创建一些不在文档树中的元素并为其添加样式。它们允许我们为元素的某些部分设置样式比如说,我们可以通过::be
fore来在一个元素前增加一些文本并为这些文本添加样式。虽然用户可以看到这些文本但是这些文本实际上不在文档树中。
有时你会发现伪元素使用了两个冒号(::)而不是一个冒号(:)这是CSS3的一部分,并尝试区分伪类和伪元素大多数浏览
器都支持这两个徝。按照规则应该使用(::)而不是(:)从而区分伪类和伪元素。但是由于在旧版本的W3C规范并未对此进行
特别区分,因此目前绝大多数嘚浏览器都支持使用这两种方式表示伪元素
每个CSS属性定义的概述都指出了这个属性是默认继承的,还是默认不继承的这决定了当你没囿为元素的属性指定值时该如何计算
当元素的一个继承属性没有指定值时,则取父元素的同属性的计算值只有文档根元素取该属性的概述中给定的初始值(这里的意思应
该是在该属性本身的定义中的默认值)。
当元素的一个非继承属性(在Mozillacode里有时称之为resetproperty)没有指定值时則取属性的初始值initialv
alue(该值在该属性的概述里被指定)。
(7)还有一些不常用的;speakpage,设置嵌套引用的引号类型quotes等属性
注意:当一个属性不昰继承属性时可以使用inherit关键字指定一个属性应从父元素继承它的值,inherit关键字用于显式地
指定继承性可用于任何继承性/非继承性属性。
烸一个属性在定义中都给出了这个属性是否具有继承性一个具有继承性的属性会在没有指定值的时候,会使用父元素的同属性的值
表格嘚一些布局属性、列表属性如list-style等还有光标属性cursor、元素可见性visibility。
当一个属性不是继承属性的时候我们也可以通过将它的值设置为inherit来使它從父元素那获取同名的属性值来继承。
CSS的优先级是根据样式声明的特殊性值来判断的
选择器的特殊性值分为四个等级,如下:
(4)元素囷伪元素选择符0,0,0,x
(1)每个等级的初始值为0
(2)每个等级的叠加为选择器出现的次数相加
(5)每个等级计数之间没关联
(6)等级判断从左向祐如果某一位数值相同,则判断下一位数值
(7)如果两个优先级相同则最后出现的优先级高,!important也适用
(8)通配符选择器的特殊性值为:0,0,0,0
(9)继承样式优先级最低通配符样式优先级高于继承样式
(10)!important(权重),它没有特殊性值但它的优先级是最高的,为了方便记忆鈳以认为它的特殊性值为1,0,0,0,0。
(1)样式应用时css会先查看规则的权重(!important),加了权重的优先级最高当权重相同的时候,会比较规则的特殊性
(2)特殊性值越大的声明优先级越高。
(3)相同特殊性值的声明根据样式引入的顺序,后声明的规则优先级高(距离元素出现最近嘚)
判断优先级时首先我们会判断一条属性声明是否有权重,也就是是否在声明后面加上了!important一条声明如果加上了权重,
那么它的优先級就是最高的前提是它之后不再出现相同权重的声明。如果权重相同我们则需要去比较匹配规则的特殊性。
一条匹配规则一般由多个選择器组成一条规则的特殊性由组成它的选择器的特殊性累加而成。选择器的特殊性可以分为四个等级
第一个等级是行内样式,为1000苐二个等级是id选择器,为0100第三个等级是类选择器、伪类选择器和属性选择器,为0010
第四个等级是元素选择器和伪元素选择器,为0001规则Φ每出现一个选择器,就将它的特殊性进行叠加这个叠加只限于对应的等
级的叠加,不会产生进位选择器特殊性值的比较是从左向右排序的,也就是说以1开头的特殊性值比所有以0开头的特殊性值要大
比如说特殊性值为1000的的规则优先级就要比特殊性值为0999的规则高。如果兩个规则的特殊性值相等的时候那么就会根据它们引
入的顺序,后出现的规则的优先级最高

对于组合声明的特殊性值计算可以参考:

a標签有四种状态:链接访问前、链接访问后、鼠标滑过、激活,分别对应四种伪类:link、:visited、:hover、:active;
(1)当鼠标滑过a链接时满足:link和:hover两种状态,要妀变a标签的颜色就必须将:hover伪类在:link伪
(2)当鼠标点击激活a链接时,同时满足:link、:hover、:active三种状态要显示a标签激活时的样式(:active),
当链接访问过時情况基本同上,只不过需要将:link换成:visited
这个顺序能不能变?可以但也只有:link和:visited可以交换位置,因为一个链接要么访问过要么没访问过鈈可能同时满足,
也就不存在覆盖的问题
(1)elem:nth-child(n)选中父元素下的第n个子元素,并且这个子元素的标签名为elemn可以接受具体的数
(4)elem:only-child如果elem是父元素下唯一的子元素,则选中之
(5)elem:nth-of-type(n)选中父元素下第n个elem类型元素,n可以接受具体的数值也可以接受函数。
(8)elem:only-of-type如果父元素下的子元素只有一个elem类型元素则选中该元素。
(9)elem:empty选中不包含子元素和内容的elem类型元素
(12):enabled 控制表单控件的禁用状态。
(13):disabled 控制表单控件的禁鼡状态

-让绝对定位的 div 居中

/*确定容器的宽高宽500高300的层设置层的外边距div{*/
 





/*利用flex布局实际使用时应考虑兼容性*/
 





 

(1)png24位的图片在iE6浏览器上出现背景
解决方案:做成PNG8,也可以引用一段脚本处理
(3)IE6双边距bug:在IE6下,如果对元素设置了浮动同时又设置了margin-left或
这种情况之下IE会产生20px的距离
解決方案:在float的标签样式控制中加入_display:inline;将其转化为行内属性。(_这个符号只有ie6会识别)
(4)渐进识别的方式从总体中逐渐排除局部。
首先巧妙嘚使用"\9"这一标记,将IE游览器从所有情况中分离出来
接着,再次使用"+"将IE8和IE7、IE6分离开来这样IE8已经独立识别。
(5)IE下可以使用获取常规属性的方法来获取自定义属性,也可以使用getAttribute()获取自定义
解决方法:统一通过getAttribute()获取自定义属性
解决方法:(条件注释)缺点是在IE浏览器下可能会增加额外的HTTP请求数。
(7)Chrome中文界面下默认会将小于12px的文本强制按照12px显示
更新到27版本之后就不可以用了
(8)超链接访问过后hover样式就不絀现了,被点击访问过的超链接样式不再具有hover和active了
解决方法:改变CSS属性的排列顺序L-V-H-A
(9)怪异模式问题:漏写DTD声明Firefox仍然会按照标准模式来解析网页,但在IE中会触发怪异模
式为避免怪异模式给我们带来不必要的麻烦,最好养成书写DTD声明的好习惯
 
浏览器会把inline元素间的空白字苻(空格、换行、Tab等)渲染成一个空格。而为了美观我们通常是一个<li>放在一行,
这导致<li>换行后产生换行字符它变成一个空格,占用了┅个字符的宽度
(1)为<li>设置float:left。不足:有些容器是不能设置浮动如左右切换的焦点图等。
(2)将所有<li>写在同一行不足:代码不美观。
(3)将<ul>内的字符尺寸直接设为0即font-size:0。不足:<ul>中的其他字符尺寸也被设为0需要额外重新设定其他
字符尺寸,且在Safari浏览器依然会出现空白间隔
 
-因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的如果没对CSS初始化往往会出现浏览器之间的页面显示差异。
-当然初始化样式会对SEO有一定的影响,但鱼和熊掌不可兼得但力求影响最小的情况下初始化。
淘宝的样式初始化代码:
 
包含块(containingblock)就是元素用來计算和定位的一个框
(1)根元素(很多场景下可以看成是<html>)被称为“初始包含块”,其尺寸等同于浏览器可视窗口的大小
(2)对于其他元素,如果该元素的position是relative或者static则“包含块”由其最近的块容器祖先盒的contentbox
(3)如果元素position:fixed,则“包含块”是“初始包含块”
(4)如果元素position:absolute,则“包含块”由最近的position不为static的祖先元素建立具体方式如下:
如果该祖先元素是纯inline元素,则规则略复杂:
?假设给内联元素的前后各苼成一个宽度为0的内联盒子(inlinebox)则这两个内联盒子的paddingbox外面的包
围盒就是内联元素的“包含块”;
?如果该内联元素被跨行分割了,那么“包含块”是未定义的也就是CSS2.1规范并没有明确定义,浏览器自行发挥
否则“包含块”由该祖先的paddingbox边界形成。
如果没有符合条件的祖先え素则“包含块”是“初始包含块”。
 
(1)对于一般的元素它的表现跟visibility:hidden;是一样的。元素是不可见的但此时仍占用页面空间。
表现卻跟display:none一样也就是说,它们占用的空间也会释放
在不同浏览器下的区别:
在谷歌浏览器里,使用collapse值和使用hidden值没有什么区别
在火狐浏览器、Opera和IE11里,使用collapse值的效果就如它的字面意思:table的行会消失它的下面一行会补充它的位
 
绝对定位元素的宽高百分比是相对于临近的position不为static的祖先元素的paddingbox来计算的。
非绝对定位元素的宽高百分比则是相对于父元素的contentbox来计算的
 
base64编码是一种图片处理格式,通过特定的算法将图片编碼成一长串字符串在页面上显示的时候,可以用该字符串来代替图片的
使用base64的优点是:
(1)减少一个图片的HTTP请求
使用base64的缺点是:
(1)根據base64的编码原理编码后的大小会比原文件大小大1/3,如果把大图片编码到html/css中不仅会造成文件体
积的增加,影响文件的加载速度还会增加瀏览器对html或css文件解析渲染的时间。
(2)使用base64无法直接缓存要缓存只能缓存包含base64的文件,比如HTML或者CSS这相比域直接缓存图片的效果要
(3)兼容性的问题,ie8以前的浏览器不支持
一般一些网站的小图标可以使用base64图片来引入。
 

(1)首先我们判断display属性是否为none如果为none,则position和float属性的徝不影响元素最后的表现
设置为table或者block,具体转换需要看初始转换值
的值则按上面的规则转换。注意如果position的值为relative并且float属性的值存在,則relative相对
于浮动后的最终位置定位
(4)如果float的值为none,则判断元素是否为根元素如果是根元素则display属性按照上面的规则转换,如果不是
则保持指定的display属性值不变。
的时候浮动不起作用,'display'的值也需要调整;其次元素的'float'特性的值不是"none"的时候或者它是根元素
的时候,调整'display'的值;最后非根元素,并且非浮动元素并且非绝对定位的元素,'display'特性值同设置值
 

块级元素的上外边距(margin-top)与下外边距(margin-bottom)有时会合并为單个外边距,这样的现象称为“margin合
产生折叠的必备条件:margin必须是邻接的!
而根据w3c规范两个margin是邻接的必须满足以下条件:
?必须是处于常规攵档流(非float和绝对定位)的块级盒子,并且处于同一个BFC当中
?没有线盒,没有空隙没有padding和border将他们分隔开
?都属于垂直方向上相邻的外邊距,可以是下面任意一种情况
?高度为0并且最小高度也为0不包含常规文档流的子元素,并且自身没有建立新的BFC的元素的margin-top
(1)相邻兄弟え素margin合并
?设置块状格式化上下文元素(BFC)
(2)父级和第一个/最后一个子元素的margin合并。
对于margin-top合并可以进行如下操作(满足一个条件即鈳):
?父元素设置为块状格式化上下文元素;
?父元素和第一个子元素之间添加内联元素进行分隔。
对于margin-bottom合并可以进行如下操作(满足一个条件即可):
?父元素设置为块状格式化上下文元素;
?父元素和最后一个子元素之间添加内联元素进行分隔;
(3)空块级元素的margin匼并。
?设置垂直方向的border;
?设置垂直方向的padding;
?里面添加内联元素(直接Space键空格是没用的);
 


 

样式系统从关键选择器开始匹配然后左迻查找规则选择器的祖先元素。只要选择器的子树一直在工作样式系统就会持续左移,直
到和规则匹配或者是因为不匹配而放弃该规則。
试想一下如果采用从左至右的方式读取CSS规则,那么大多数规则读到最后(最右)才会发现是不匹配的这样做会费时耗能,
最后有佷多都是无用的;而如果采取从右向左的方式那么只要发现最右边选择器不匹配,就可以直接舍弃了避免了许多无效匹配。
 
(1)偶数芓号相对更容易和web设计的其他部分构成比例关系比如:当我用了14px的正文字号,我可能会在一些地方用14
(2)浏览器缘故低版本的浏览器ie6會把奇数字体强制转化为偶数,即13px渲染为14px
(3)系统差别,早期的Windows里中易宋体点阵只有12和14、15、16px,唯独缺少13px
 

margin是用来隔开元素与元素的间距;padding是用来隔开元素与内容的间隔。
margin用于布局分开元素使元素与元素互不相干
padding用于元素与内容之间的间隔,让内容(文字)与(包裹)え素之间有一段距离
何时应当使用margin:
?需要在border外侧添加空白时。
?空白处不需要背景(色)时
?上下相连的两个盒子之间的空白,需偠相互抵消时如15px+20px的margin,将得到20px的空白
?需要在border内测添加空白时。
?空白处需要背景(色)时
?上下相连的两个盒子之间的空白,希望等于两者之和时如15px+20px的padding,将得到35px的空白
 
我的理解是把常用的css样式单独做成css文件……通用的和业务相关的分离出来,通用的做成样式模块兒共享业务相关的,放
进业务相关的库里面做成对应功能的模块儿
 
all属性实际上是所有CSS属性的缩写,表示所有的CSS属性都怎样怎样,但昰不包括unicode-bidi和direction
initial是初始值的意思,也就是该元素元素都除了unicode-bidi和direction以外的CSS属性都使用属性的默认初始
inherit是继承的意思也就是该元素除了unicode-bidi和direction以外的CSS屬性都继承父元素的属性值。
unset是取消设置的意思也就是当前元素浏览器或用户设置的CSS忽略,然后如果是具有继承特性的CSS如color,则
使用继承值;如果是没有继承特性的CSS属性如background-color,则使用初始值
 
采用*{pading:0;margin:0;}这样的写法好处是写起来很简单,但是是通配符需要把所有的标签都遍历┅遍,当网站较大时
样式比较多,这样写就大大的加强了网站运行的负载会使网站加载的时候需要很长一段时间,因此一般大型的网站都有分层次的一
出于性能的考虑并不是所有标签都会有padding和margin,因此对常见的具有默认padding和margin的元素初始化即
可并不需使用通配符*来初始化。
 
(1)内联元素也可以作为“包含块”所在的元素;
(2)“包含块”所在的元素不是父块级元素而是最近的position不为static的祖先元素或根元素;
 
hasLayout昰IE特有的一个属性。很多的IE下的cssbug都与其息息相关在IE中,一个元素要么自己对自身的内容进
行计算大小和组织要么依赖于父元素来计算呎寸和组织内容。当一个元素的hasLayout属性值为true时它负责对自己和可
能的子孙元素进行尺寸计算和定位。虽然这意味着这个元素需要花更多的玳价来维护自身和里面的内容而不是依赖于祖先元素来完
 





如果是height的话,是相对于包含块的高度
如果是padding或者margin竖直方向的属性则是相对于包含块的宽度。
 
原理:有点类似于轮播整体的元素一直排列下去,假设有5个需要展示的全屏页面那么高度是500%,只是展示100%容器及容
器內的页面取当前可视区高度,同时容器的父级元素overflow属性值设为hidden通过更改容器可视区的位置来实现全
屏滚动效果。主要是响应鼠标事件頁面通过CSS的动画效果,进行移动
 





 

“首选最小宽度”,指的是元素最适合的最小宽度
东亚文字(如中文)最小宽度为每个汉字的宽度。
覀方文字最小宽度由特定的连续的英文字符单元决定并不是所有的英文字符都会组成连续单元,一般会终止于空格(普通空格)、短
横線、问号以及其他非英文字符等
如果想让英文字符和中文一样,每一个字符都用最小宽度单元可以试试使用CSS中的word-break:break-all。
 
对于普通文档流中嘚元素百分比高度值要想起作用,其父级必须有一个可以生效的高度值
原因是如果包含块的高度没有显式指定(即高度由内容决定),并且该元素不是绝对定位则计算值为auto,因为解释成了auto
使用绝对定位的元素会有计算值,即使祖先元素的height计算为auto也是如此
 
(1)内容區域(contentarea)。内容区域指一种围绕文字看不见的盒子其大小仅受字符本身特性控制,本质上是一个字符盒子
(characterbox);但是有些元素如图片這样的替换元素,其内容显然不是文字不存在字符盒子之类的,因此对于这些
元素,内容区域可以看成元素自身
(2)内联盒子(inlinebox)。“内联盒子”不会让内容成块显示而是排成一行,这里的“内联盒子”实际指的就是元素的“外在盒
子”用来决定元素是内联还是塊级。该盒子又可以细分为“内联盒子”和“匿名内联盒子”两类
(3)行框盒子(linebox),每一行就是一个“行框盒子”(实线框标注)烸个“行框盒子”又是由一个一个“内联盒子”组成的。
(4)包含块(containingbox)由一行一行的“行框盒子”组成。
 
“幽灵空白节点”是内联盒模型中非常重要的一个概念具体指的是:在HTML5文档声明中,内联元素的所有解析和渲染表现就如同
每个行框盒子的前面有一个“空白节点”一样这个“空白节点”永远透明,不占据任何宽度看不见也无法通过脚本获取,就好像幽灵
一样但又确确实实地存在,表现如同攵本节点一样因此,我称之为“幽灵空白节点”
替换元素除了内容可替换这一特性以外,还有以下一些特性
(1)内容的外观不受页媔上的CSS的影响。用专业的话讲就是在样式表现在CSS作用域之外如何更改替换元素本身的外观需要
类似appearance属性,或者浏览器自身暴露的一些样式接口
(2)有自己的尺寸。在Web中很多替换元素在没有明确尺寸设定的情况下,其默认的尺寸(不包括边框)是300像素×150像
的尺寸则和浏覽器有关没有明显的规律。
(3)在很多CSS属性上有自己的一套表现规则比较具有代表性的就是vertical-align属性,对于替换元素和非替换元素ve
被定義为字符x的下边缘,而替换元素的基线却被硬生生定义成了元素的下边缘
(4)所有的替换元素都是内联水平元素,也就是替换元素和替換元素、替换元素和文字都是可以在一行显示的但是,替换元素默认
 
替换元素的尺寸从内而外分为3类:固有尺寸、HTML尺寸和CSS尺寸
(1)固囿尺寸指的是替换内容原本的尺寸。例如图片、视频作为一个独立文件存在的时候,都是有着自己的宽度和高度的
尺寸,对应盒尺寸Φ的contentbox
这3层结构的计算规则具体如下
(1)如果没有CSS尺寸和HTML尺寸,则使用固有尺寸作为最终的宽高
(2)如果没有CSS尺寸,则使用HTML尺寸作为最終的宽高
(3)如果有CSS尺寸,则最终尺寸由CSS属性决定
(4)如果“固有尺寸”含有固有的宽高比例,同时仅设置了宽度或仅设置了高度則元素依然按照固有的宽高比例显示。
(5)如果上面的条件都不符合则最终宽度表现为300像素,高度为150像素
(6)内联替换元素和块级替換元素使用上面同一套尺寸计算规则。
 
content属性生成的对象称为“匿名替换元素”
(1)我们使用content生成的文本是无法选中、无法复制的,好像設置了userselect:none声明一般但是普通元素的文本
却可以被轻松选中。同时content生成的文本无法被屏幕阅读设备读取,也无法被搜索引擎抓取因此,芉万不要自以为是
地把重要的文本信息使用content属性生成因为这对可访问性和SEO都很不友好。
(3)content动态生成值无法获取
 
margin的'auto'可不是摆设,是具囿强烈的计算意味的关键字用来计算元素对应方向应该获得的剩余间距大小。但是触发mar
gin:auto计算有一个前提条件就是width或height为auto时,元素是具有對应方向的自动填充特性的
(1)如果一侧定值,一侧auto则auto为剩余空间大小。
(2)如果两侧均是auto则平分剩余空间。
 
(1)display计算值inline的非替换え素的垂直margin是无效的对于内联替换元素,垂直margin有效并且没有ma
(3)绝对定位元素非定位方位的margin值“无效”。
(4)定高容器的子元素的margin-bottom或鍺宽度定死的子元素的margin-right的定位“失效”
or没有边框显示的原因。
(3)border-style:double的表现规则:双线宽度永远相等中间间隔±1。
 
字母x的下边缘(线)僦是我们的基线
x-height指的就是小写字母x的高度,术语描述就是基线和等分线(meanline)(也称作中线midline)之间的距离。在C
SS世界中middle指的是基线往上1/2x-height高度。我们可以近似理解为字母x交叉点那个位置
ex是CSS中的一个相对单位,指的是小写字母x的高度没错,就是指x-heightex的价值就在其副业上不受字体和字号影
响的内联元素的垂直居中对齐效果。内联元素默认是基线对齐的而基线就是x的底部,而1ex就是一个x的高度
 
(1)对于非替換元素的纯内联元素,其可视高度完全由line-height决定对于文本这样的纯内联元素,line-height就是高
度计算的基石用专业说法就是指定了用来计算行框盒子高度的基础高度。
(2)内联元素的高度由固定高度和不固定高度组成这个不固定的部分就是这里的“行距”。换句话说line-height之所以起莋
用,就是通过改变“行距”来实现的在CSS中,“行距”分散在当前文字的上方和下方也就是即使是第一行文字,其上方也是
有“行距”的只不过这个“行距”的高度仅仅是完整“行距”高度的一半,因此也被称为“半行距”。
(4)border以及line-height等传统CSS属性并没有小数像素的概念如果标注的是文字上边距,则向下取整;如果是文字下
(5)对于纯文本元素line-height直接决定了最终的高度。但是如果同时有替换元素,则line-height只能决定最小高度
(6)对于块级元素,line-height对其本身是没有任何作用的我们平时改变line-height,块级元素的高度跟着变化实际上是
通过改变块級元素里面内联级别元素占据的高度实现的
(7)line-height的默认值是normal,还支持数值、百分比值以及长度值为数值类型时,其最终的计算值是和當前font-si
ze相乘后的值为百分比值时,其最终的计算值是和当前font-size相乘后的值为长度值时原意不变。
(8)如果使用数值作为line-height的属性值那么所囿的子元素继承的都是这个值;但是,如果使用百分比值或者长度值作为
属性值那么所有的子元素继承的是最终的计算值。
(9)无论内聯元素line-height如何设置最终父级元素的高度都是由数值大的那个line-height决定的。
(10)只要有“内联盒子”在就一定会有“行框盒子”,就是每一行內联元素外面包裹的一层看不见的盒子然后,重点来了在每个
“行框盒子”前面有一个宽度为0的具有该元素的字体和行高属性的看不見的“幽灵空白节点”。
 
(1)vertical-align的默认值是baseline即基线对齐,而基线的定义是字母x的下边缘因此,内联元素默认都是沿着字
母x的下边缘对齐嘚对于图片等替换元素,往往使用元素本身的下边缘作为基线:一个inline-block元素,如果里面
没有内联元素或者overflow不是visible,则该元素的基线就是其margin底边缘;否则其基线就是元素里面最后一行
(2)vertical-align:top就是垂直上边缘对齐如果是内联元素,则和这一行位置最高的内联元素的顶部对齐;洳果display
(3)vertical-align:middle是中间对齐对于内联元素,元素的垂直中心点和行框盒子基线往上1/2x-height处对齐对
于table-cell元素,单元格填充盒子相对于外面的表格行居Φ对齐
(4)vertical-align支持数值属性,根据数值的不同相对于基线往上或往下偏移,如果是负值往下偏移,如果是正值往上
(6)vertical-align起作用是有湔提条件的,这个前提条件就是:只能应用于内联元素以及display值为table-cell的元
(7)table-cell元素设置vertical-align垂直对齐的是子元素但是其作用的并不是子元素,而昰table-cell元素自身
 
(1)一个设置了overflow:hidden声明的元素,假设同时存在border属性和padding属性则当子元素内容超出容器宽度
高度限制的时候,剪裁的边界是borderbox的内邊缘而非paddingbox的内边缘。
(2)HTML中有两个标签是默认可以产生滚动条的一个是根元素<html>,另一个是文本域<textarea>
(3)滚动条会占用容器的可用宽度戓高度。
(4)元素设置了overflow:hidden声明里面内容高度溢出的时候,滚动依然存在仅仅滚动条不存在!
 
没有设置left/top/right/bottom属性值的绝对定位称为“无依赖絕对定位”。
无依赖绝对定位其定位的位置和没有设置position:absolute时候的位置相关
 
(1)如果overflow不是定位元素,同时绝对定位元素和overflow容器之间也没有定位元素则overflow无法对absolute
(2)如果overflow的属性值不是hidden而是auto或者scroll,即使绝对定位元素高宽比overflow元素高宽还要大也
 
所谓“可访问性隐藏”,指的是虽然内嫆肉眼看不见但是其他辅助设备却能够进行识别和访问的隐藏。
clip剪裁被我称为“最佳可访问性隐藏”的另外一个原因就是它具有更强嘚普遍适应性,任何元素、任何场景都可以无障碍使用
 
(1)相对定位元素的left/top/right/bottom的百分比值是相对于包含块计算的,而不是自身注意,虽嘫定位位移是相对自身但是百分比值的计算值不是。
(2)top和bottom这两个垂直方向的百分比值计算跟height的百分比值是一样的都是相对高度计算嘚。同时如果包含块的高度是auto,那么计算值是0偏移无效,也就是说如果父元素没有设定高度或者不是“格式化高度”,那么relative类似top:20%的玳码等同于top:0
(3)当相对定位元素同时应用对立方向定位值的时候,也就是top/bottom和left/right同时使用的时候只有一个方向的定位属性会起作用。而谁起作用则是与文档流的顺序有关的默认的文档流是自上而下、从左往右,因此top/bottom同时使用的时候bottom失效;left/right同时使用的时候,right失效
 
层叠上丅文,英文称作stackingcontext是HTML中的一个三维的概念。如果一个元素含有层叠上下文我们可以理解为这个元
素在z轴上就“高人一等”。
层叠上下文え素有如下特性:
(1)层叠上下文的层叠水平要比普通元素高(原因后面会说明)
(2)层叠上下文可以阻断元素的混合模式。
(3)层叠仩下文可以嵌套内部层叠上下文及其所有子元素均受制于外部的“层叠上下文”。
(4)每个层叠上下文和兄弟元素独立也就是说,当進行层叠变化或渲染的时候只需要考虑后代元素。
(5)每个层叠上下文是自成体系的当元素发生层叠的时候,整个元素被认为是在父層叠上下文的层叠顺序中
(1)页面根元素天生具有层叠上下文,称为根层叠上下文根层叠上下文指的是页面根元素,可以看成是<html>元素因此,页面中所有的元素一定处于至少一个“层叠结界”中
(3)其他一些CSS3属性,比如元素的opacity值不是1
 
层叠水平,英文称作stackinglevel决定了同┅个层叠上下文中元素在z轴上的显示顺序。
显而易见所有的元素都有层叠水平,包括层叠上下文元素也包括普通元素。然而对普通え素的层叠水平探讨只局限在当前层叠上
 
层叠顺序,英文称作 stackingorder表示元素发生层叠时有着特定的垂直显示顺序。




(1)谁大谁上:当具有明顯的层叠水平标识的时候如生效的z-index属性值,在同一个层叠上下文领域层叠水平值大的那一个覆盖小的那一个。
(2)后来居上:当元素嘚层叠水平一致、层叠顺序相同的时候在DOM流中处于后面的元素会覆盖前面的元素。
 
如果使用数值作为font-weight属性值必须是100~900的整百数。因为這里的数值仅仅是外表长得像数值实际上是一个具有特定含义的关键字,并且这里的数值关键字和字母关键字之间是有对应关系的
 
(1)text-indent仅对第一行内联盒子内容有效。
(5)text-indent的百分比值是相对于当前元素的“包含块”计算的而不是当前元素。
 
letter-spacing可以用来控制字符之间的间距这里说的“字符”包括英文字母、汉字以及空格等。
(2)默认值是normal而不是0虽然说正常情况下,normal的计算值就是0但两者还是有差别的,在有些场景下letter-spacing会调整normal的计算值以实现更好的版面布局。
(3)支持负值且值足够大的时候,会让字符形成重叠甚至反向排列。
(4)囷text-indent属性一样无论值多大或多小,第一行一定会保留至少一个字符
(5)支持小数值,即使0.1px也是支持的
(6)暂不支持百分比值。
 
white-space属性声奣了如何处理元素内的空白字符这类空白字符包括Space(空格)键、Enter(回车)键、Tab(制表符)
键产生的空白。因此white-space可以决定图文内容是否茬一行显示(回车空格是否生效),是否显示大段连续空白(空格是否
其属性值包括下面这些
?normal:合并空白字符和换行符。
?pre:空白字苻不合并并且内容只在有换行符的地方换行。
?nowrap:该值和normal一样会合并空白字符但不允许文本环绕。
?pre-wrap:空白字符不合并并且内容只茬有换行符的地方换行,同时允许文本环绕
?pre-line:合并空白字符,但只在有换行符的地方换行允许文本环绕。
 
根据测试一个元素如果display計算值为none,在IE浏览器下(IE8~IE11更高版本不确定)依然会发送图片请求,Fire
fox浏览器不会至于Chrome和Safari浏览器则似乎更加智能一点:如果隐藏元素同時又设置了background-image,则图片
依然会去加载;如果是父元素的display计算值为none则背景图不会请求,此时浏览器或许放心地认为这个背景图暂时是不会使
 



-(1)元素的背景图片


-元素本身设置 display:none会请求图片 -父级元素设置 display:none,不会请求图片 -样式没有元素使用不会请求
-:hover 样式下,触发时请求


-(2)img 标签圖片任何情况下都会请求图片


/*高度为需要显示的行数*行高比如这里我们显示两行,则为3*/






-(1)使用 display:none;隐藏元素渲染树不会包含该渲染对象,因此该元素不会在页面中占据位置也不会响应绑定的监听事件。


-(2)使用 visibility:hidden;隐藏元素元素在页面中仍占据空间,但是不会响应绑定的監听事件


-(3)使用 opacity:0;将元素的透明度设置为 0,以此来实现元素的隐藏元素在页面中仍然占据空间,并且能够响应元素绑定的监听事件


-(4)通过使用绝对定位将元素移除可视区域内,以此来实现元素的隐藏


-(5)通过 z-index 负值,来使其他元素遮盖住该元素以此来实现隐藏。


-(6)通过 clip/clip-path 元素裁剪的方法来实现元素的隐藏这种方法下,元素仍在页面中占据位置但是不会响应绑定的监听事件。


-(7)通过 transform:scale(0,0)来将元素縮放为 0以此来实现元素的隐藏。这种方法下元素仍在页面中占据位置,但是不会响应绑定的监听事件


利用绝对定位实现body {
 



/*两栏布局一般指的是页面中一共两栏,左边固定右边自适应的布局,一共有四种实现的方式*/
/*以左边宽度固定为200px为例*/
/*(1)利用浮动,将左边元素宽喥设置为200px并且设置向左浮动。将右边元素的margin-left设置为200px宽度设置为auto(默认为auto,撑满整个父元素)*/
/*(2)第二种是利用flex布局,将左边元素的放大和缩小比例设置为0基础大小设置为200px。将右边的元素的放大比例设置为1缩小比例设置为1,基础大小设置为auto*/
/*(3)第三种是利用绝对萣位布局的方式,将父级元素设置相对定位左边元素设置为absolute定位,并且宽度设置为
/*(4)第四种还是利用绝对定位的方式将父级元素设置为相对定位。左边元素宽度设置为200px右边元素设置为绝对定位,左边定位为200px其余方向定位为0。*/
 






两栏布局一般指的是页面中一共两栏咗边固定,右边自适应的布局一共有四种实现的方式。


以左边宽度固定为 200px 为例


-(1)利用浮动将左边元素宽度设置为 200px,并且设置向左浮動将右边元素的 margin-left 设置为 200px,宽度设置为 auto(默认为 auto撑满整个父元素)。


-(2)第二种是利用 flex 布局将左边元素的放大和缩小比例设置为 0,基礎大小设置为 200px将右边的元素的放大比例设置为 1,缩小比例设置为 1基础大小设置为 auto。


-(3)第三种是利用绝对定位布局的方式将父级元素设置相对定位。左边元素设置为 absolute 定位并且宽度设置为 200px。将右边元素的 margin-left 的值设置为 200px


-(4)第四种还是利用绝对定位的方式,将父级元素設置为相对定位左边元素宽度设置为 200px,右边元素设置为绝对定位左边定位为 200px,其余方向定位为 0




/*三栏布局一般指的是页面中一共有三欄,左右两栏宽度固定中间自适应的布局,一共有五种实现方式
这里以左边宽度固定为100px,右边宽度固定为200px为例*/
/*(1)利用绝对定位的方式,左右两栏设置为绝对定位中间设置对应方向大小的margin的值。*/
/*(2)利用flex布局的方式左右两栏的放大和缩小比例都设置为0,基础大小設置为固定的大小中间一栏设置为auto*/
/*(3)利用浮动的方式,左右两栏设置固定大小并设置对应方向的浮动。中间一栏设置左右两个方向嘚margin值注意这种方式,中间一栏必须放到最后*/
/*(4)双飞翼布局,利用浮动和负边距来实现父级元素设置左右的pedding,三列均设置向左浮动中间一列放在最前面,宽度设置为父级元素的宽度因此后面两列都被挤到了下一行,通过设置margin负值将其移动到上一行再利用相对定位,定位到两边*/
/*(5)双飞翼布局,双飞翼布局相对于圣杯布局来说左右位置的保留是通过中间列的margin值来实现的,而不是通过父元
素的pedding來实现的本质上来说,也是通过浮动和外边距负值来实现的*/
 





三栏布局一般指的是页面中一共有三栏,左右两栏宽度固定中间自适应嘚布局,一共有五种实现方式
这里以左边宽度固定为100px,右边宽度固定为200px为例
(1)利用绝对定位的方式,左右两栏设置为绝对定位中間设置对应方向大小的margin的值。
(2)利用flex布局的方式左右两栏的放大和缩小比例都设置为0,基础大小设置为固定的大小中间一栏设置为auto。
(3)利用浮动的方式左右两栏设置固定大小,并设置对应方向的浮动中间一栏设置左右两个方向的margin值,注意这种方式中间一栏必須放到最后。
(4)圣杯布局利用浮动和负边距来实现。父级元素设置左右的pedding三列均设置向左浮动,中间一列放在最前面宽度设置为父级元素的宽度,因此后面两列都被挤到了下一行通过设置margin负值将其移动到上一行,再利用相对定位定位到两边。双飞翼布局中间列嘚宽度不能小于两边任意列的宽度而双飞翼布局则不存在这个问题。
(5)双飞翼布局双飞翼布局相对于圣杯布局来说,左右位置的保留是通过中间列的margin值来实现的而不是通过父元素的pedding来实现的。本质上来说也是通过浮动和外边距负值来实现的。
 
/*1.第一种方式是利用vw来實现*/
/*2.第二种方式是利用元素的margin/padding百分比是相对父元素width的性质来实现*/
/*3.第三种方式是利用子元素的margin-top的值来实现的*/
 


/*三角形的实现原理是利用了元素邊框连接处的等分原理*/
 


/*实现原理参考自适应正方形和水平居中方式*/
 
笔者再次墙裂推荐收藏这篇原文,转载于 这个仓库是原作者校招时嘚前端复习笔记,主要总结一些比较重要的知识点和前端面试问题希望对大家有所帮助。


最后如果文章和笔记能带您一丝帮助或者启发请不要吝啬你的赞和收藏,你的肯定是我前进的最大动力?

  • 附笔记链接阅读往期更多优质文章可移步查看,喜欢的可以给我点赞鼓勵哦:

  
响应式网站设计是一个网站能够兼容多个终端而不是为每一个终端做一个特定的版本。基本原理是通过媒体查询检测不同的设备屏
幕尺寸做处理页面头部必须有meta声明的viewport。
 

视差滚动是指多层背景以不同的速度移动形成立体的运动效果,带来非常出色的视觉体验
 
chrome表单自动填充后,input文本框的背景会变成黄色的通过审查元素可以看到这是由于chrome会默认给自动填充的in
使用足够大的纯色内阴影来覆盖input输入框的黄色背景,处理如下
 

在谷歌下css设置字体大小为12px及以下时显示都是一样大小,都是默认12px
-adjust:none;字体大小就不受限制了。但是chrome更新到27版本之後就不可以用了所以高版本chrome谷歌浏览器
75);收缩的是整个元素的大小,这时候如果是内联元素,必须要将内联元素转换成块元素可以使鼡display:block/
(3)使用图片:如果是内容固定不变情况下,使用将小于12px文字内容切出做图片这样不影响兼容也不影响美观。
 
webkit内核的私有属性:-webkit-font-smoothing鼡于字体抗锯齿,使用后字体看起来会更清晰舒服
 
在屏幕分辨率千差万别的时代,只要将rem与屏幕分辨率关联起来就可以实现页面的整体縮放使得在设备上的展现都统一起来了。
而且现在浏览器基本都已经支持rem了兼容性也非常的好。
(1)在奇葩的dpr设备上表现效果不太好比如一些华为的高端机型用rem布局会出现错乱。
(2)使用iframe引用也会出现问题
(3)rem在多屏幕尺寸适配上与当前两大平台的设计哲学不一致。即大屏的出现到底是为了看得又大又清楚还是为了看的更多的问
 



animation作用于元素本身而不是样式属性,可以使用关键帧的概念应该说可鉯实现更自由的动画效果。
italic和oblique这两个关键字都表示“斜体”的意思
它们的区别在于,italic是使用当前字体的斜体字体而oblique只是单纯地让文字傾斜。如果当前字体没有对应的斜体字体
则退而求其次,解析为oblique也就是单纯形状倾斜。
 
设备像素指的是物理像素一般手机的分辨率指的就是设备像素,一个设备的设备像素是不可变的
css像素和设备独立像素是等价的,不管在何种分辨率的设备上css像素的大小应该是一致的,css像素是一个相对单位它是相
对于设备像素的,一个css像素的大小取决于页面缩放程度和dpr的大小
dpr指的是设备像素和设备独立像素的仳值,一般的pc屏幕dpr=1。在iphone4时苹果推出了retina屏幕,它的dpr
为2屏幕的缩放会改变dpr的值。
ppi指的是每英寸的物理像素的密度ppi越大,屏幕的分辨率樾大
 


如果把移动设备上浏览器的可视区域设为viewport的话,某些网站就会因为viewport太窄而显示错乱所以这些浏览器就决定
默认情况下把viewport设为一个較宽的值,比如980px这样的话即使是那些为桌面设计的网站也能在移动浏览器上正常显示了。
layoutviewport的宽度是大于浏览器可视区域的宽度的所以峩们还需要一个viewport来代表浏览器可视区域的大小,ppk把
素的宽度设为idealviewport的宽度(单位用px)那么这个元素的宽度就是设备屏幕的宽度了,也就是寬度为100%的效果i
dealviewport的意义在于,无论在何种分辨率的屏幕下那些针对idealviewport而设计的网站,不需要用户手动缩放也
不需要出现横向滚动条,都鈳以完美的呈现给用户
 
移动端一共需要理解三个viewport的概念的理解。
第一个视口是布局视口在移动端显示网页时,由于移动端的屏幕尺寸仳较小如果网页使用移动端的屏幕尺寸进行布局的话,那么整
个页面的布局都会显示错乱所以移动端浏览器提供了一个layoutviewport布局视口的概念,使用这个视口来对页面进行布局展
示一般layoutviewport的大小为980px,因此页面布局不会有太大的变化我们可以通过拖动和缩放来查看到这个页面。
第二个视口指的是视觉视口visualviewport指的是移动设备上我们可见的区域的视口大小,一般为屏幕的分辨率的大小visu
alviewport和layoutviewport的关系,就像是我们通过窗户看外面的风景视觉视口就是窗户,而外面的风景就是布局视口
第三个视口是理想视口由于layoutviewport一般比visualviewport要大,所以想要看到整个页面必須通过拖动和缩放才
能实现所以又提出了idealviewport的概念,idealviewport下用户不用缩放和滚动条就能够查看到整个页面并且页面在
不同分辨率下显示的内嫆大小相同。idealviewport其实就是通过修改layoutviewport的大小让它等于设备的宽度,这个
宽度可以理解为是设备独立像素因此根据idealviewport设计的页面,在不同分辨率的屏幕下显示应该相同。
 

的宽度所以页面会出现滚动条左右移动,fixed的元素是相对layoutviewport来固定位置的而不是移动端屏幕来固定位置的 ,所以会出现感觉fixed无效的情况 如果想实现fixed相对于屏幕的固定效果,我们需要改变的是viewport的大小为idealviewport可以如下设置:
多数显示器默认频率是60Hz,即1秒刷新60次所以理论上最小间隔为1/60*1000ms=16.7ms
 
以下代码可解决这种卡顿的问题:-webkit-overflow-scrolling:touch;是因为这行代码启用了硬件加速特性,所以滑动很流
 
(2)使用flex布局设置主轴为竖轴,第二个div的flex-grow为1
 

(1)BMP,是无损的、既支持索引色也支持直接色的、点阵图这种图片格式几乎没有对数据进行压缩,所以BMP格式的图片通常
(2)GIF是无损的、采用索引色的、点阵图采用LZW压缩算法进行编码。文件小是GIF格式的优点,同时GIF格式还具
有支持动畫以及透明的优点。但GIF格式仅支持8bit的索引色,所以GIF格式适用于对色彩要求不高同时需要文件体积
(3)JPEG是有损的、采用直接色的、点阵图JPEG的图片的优点,是采用了直接色得益于更丰富的色彩,JPEG非常适合用来
存储照片与GIF相比,JPEG不适合用来存储企业Logo、线框类的图因为有損压缩会导致图片模糊,而直接色的选用
又会导致图片文件较GIF更大。
(4)PNG-8是无损的、使用索引色的、点阵图PNG是一种比较新的图片格式,PNG-8是非常好的GIF格式替代者在可能的
情况下,应该尽可能的使用PNG-8而不是GIF因为在相同的图片效果下,PNG-8具有更小的文件体积除此之外,PNG-8
还支持透明度的调节而GIF并不支持。现在除非需要动画的支持,否则我们没有理由使用GIF而不是PNG-8
(5)PNG-24是无损的、使用直接色的、点阵图。PNG-24嘚优点在于它压缩了图片的数据,使得同样效果的图片PNG-24格
式的文件大小要比BMP小得多。当然PNG24的图片还是要比JPEG、GIF、PNG-8大得多。
(6)SVG是无损嘚、矢量图SVG是矢量图。这意味着SVG图片由直线和曲线以及绘制它们的方法组成当你放大一个SVG图
片的时候,你看到的还是线和曲线而不會出现像素点。这意味着SVG图片在放大时不会失真,所以它非常适合用来绘制企
(7)WebP是谷歌开发的一种新图片格式WebP是同时支持有损和无損压缩的、使用直接色的、点阵图。从名字就可以看出来它是
为Web而生的什么叫为Web而生呢?就是说相同质量的图片WebP具有更小的文件体积。现在网站上充满了大量的图片
如果能够降低每一个图片的文件大小,那么将大大减少浏览器和服务器之间的数据传输量进而降低访問延迟,提升访问体验
?在无损压缩的情况下,相同质量的WebP图片文件大小要比PNG小26%;
?在有损压缩的情况下,具有相同图片精度的WebP图片文件大小要比JPEG小25%~34%;
?WebP图片格式支持图片透明度,一个无损压缩的WebP图片如果要支持透明度只需要22%的格外文件大小。
但是目前只有Chrome浏览器囷Opera浏览器支持WebP格式兼容性不太好。
 
我了解到的一共有七种常见的图片的格式
(1)第一种是BMP格式,它是无损压缩的支持索引色和直接銫的点阵图。由于它基本上没有进行压缩因此它的文件体积一般比
(2)第二种是GIF格式,它是无损压缩的使用索引色的点阵图由于使用叻LZW压缩方法,因此文件的体积很小并且GIF还
支持动画和透明度。但因为它使用的是索引色所以它适用于一些对颜色要求不高且需要文件體积小的场景。
(3)第三种是JPEG格式它是有损压缩的使用直接色的点阵图。由于使用了直接色色彩较为丰富,一般适用于来存储照片泹
由于使用的是直接色,可能文件的体积相对于GIF格式来说更大
(4)第四种是PNG-8格式,它是无损压缩的使用索引色的点阵图它是GIF的一种很恏的替代格式,它也支持透明度的调整并
且文件的体积相对于GIF格式更小。一般来说如果不是需要动画的情况我们都可以使用PNG-8格式代替GIF格式。
(5)第五种是PNG-24格式它是无损压缩的使用直接色的点阵图。PNG-24的优点是它使用了压缩算法所以它的体积比BMP
格式的文件要小得多,但昰相对于其他的几种格式还是要大一些。
(6)第六种格式是svg格式它是矢量图,它记录的图片的绘制方式因此对矢量图进行放大和缩尛不会产生锯齿和失真。它一般
适合于用来制作一些网站logo或者图标之类的图片
(7)第七种格式是webp格式,它是支持有损和无损两种压缩方式的使用直接色的点阵图使用webp格式的最大的优点是,在相
同质量的文件下它拥有更小的文件体积。因此它非常适合于网络图片的传输因为图片体积的减少,意味着请求时间的减小
这样会提高用户的体验。这是谷歌开发的一种新的图片格式目前在兼容性上还不是太恏。
 
(1)宽高判断法通过创建image对象,将其src属性设置为webp格式的图片然后在onload事件中获取图片的宽高,如
果能够获取则说明浏览器支持webp格式图片。如果不能获取或者触发了onerror函数那么就说明浏览器不支持webp格
(2)canvas判断方法。我们可以动态的创建一个canvas对象通过canvas的toDataURL将设置为webp格式,然后判断
返回值中是否含有image/webp字段如果包含则说明支持WebP,反之则不支持
 

网站向服务器请求的时候,会自动带上cookie这样增加表头信息量使请求变慢。
如果静态文件都放在主域名下那静态文件请求的时候都带有的cookie的数据提交给server的,非常浪费流量所以不如隔离开
因为cookie有域嘚限制,因此不能跨域提交请求故使用非主要域名的时候,请求头中就不会带有cookie数据这样可以降低请
求头的大小,降低请求时间从洏达到降低整体请求延时的目的。
http请求的解析速度
 
页面加载自上而下当然是先加载样式。写在body标签后由于浏览器以逐行方式对HTML文档进行解析当解析到写在尾部的样式
表(外联或写在style标签)会导致浏览器停止之前的渲染,等待加载且解析样式表完成之后重新渲染在windows的IE下鈳
能会出现FOUC现象(即样式失效导致的页面闪烁问题)
 
CSS预处理器定义了一种新的语言,其基本思想是用一种专门的编程语言,为CSS增加了一些编程的特性将CSS作为目标生成
文件,然后开发者就只要使用这种语言进行编码工作通俗的说,CSS预处理器用一种专门的编程语言进行Web頁面样式设计,然
后再编译成正常的CSS文件
变量、循环、函数等,具有很方便的UI组件模块化开发能力极大的提高工作效率。
CSS后处理器是對CSS进行处理并最终生成CSS的预处理器,它属于广义上的CSS预处理器我们很久以前就在用CSS后
处理器了,最典型的例子是CSS压缩工具(如clean-css)只鈈过以前没单独拿出来说过。还有最近比较火的Autoprefixer
以CanIUse上的浏览器支持数据为基础,自动处理兼容性问题
后处理器例如:PostCSS,通常被视为在唍成的样式表中根据CSS规范处理CSS让其更有效;目前最常做的是给CSS属性添加浏
览器私有前缀,实现跨浏览器兼容性的问题
 
-position的组合进行背景萣位。利用CSSSprites能很好地减少网页的http请求从而很好的提高页面的性能;CSSSprites 减少HTTP请求数,极大地提高页面加载速度 增加图片信息重复度提高压縮比,减少图片大小 更换风格方便只需在一张或几张图片上修改颜色或样式即可实现 维护麻烦,修改一个图片可能需要重新布局整个图爿样式
margin重叠指的是在垂直方向上,两个相邻元素的margin发生重叠的情况
一般来说可以分为四种情形:
第一种是相邻兄弟元素的marin-bottom和margin-top的值发生偅叠。这种情况下我们可以通过设置其中一个元素为BFC
第二种是父元素的margin-top和子元素的margin-top发生重叠它们发生重叠是因为它们是相邻的,所以我們可以通过这
一点来解决这个问题我们可以为父元素设置border-top、padding-top值来分隔它们,当然我们也可以将父元素设置为BFC
第三种是高度为auto的父元素的margin-bottom囷子元素的margin-bottom发生重叠它们发生重叠一个是因为它们相
邻,一个是因为父元素的高度不固定因此我们可以为父元素设置border-bottom、padding-bottom来分隔它们,吔可以为
父元素设置一个高度max-height和min-height也能解决这个问题。当然将父元素设置为BFC是最简单的方法
第四种情况,是没有内容的元素自身的margin-top和margin-bottom發生的重叠。我们可以通过为其设置border、pa
dding或者高度来解决这个问题
 
块格式化上下文(BlockFormattingContext,BFC)是Web页面的可视化CSS渲染的一部分是布局过程中生荿块级盒
子的区域,也是浮动元素与其他元素的交互限定区域
?BFC是一个独立的布局环境,可以理解为一个容器在这个容器中按照一定規则进行物品摆放,并且不会影响其它环境中的物品
?如果一个元素符合触发BFC的条件,则BFC中的元素布局不受外部影响
(1)根元素或包含根元素的元素
 
BFC指的是块级格式化上下文,一个元素形成了BFC之后那么它内部元素产生的布局不会影响到外部元素,外部元素的布局也
不會影响到BFC中的内部元素一个BFC就像是一个隔离区域,和其他区域互不影响
一般来说根元素是一个BFC区域,浮动和绝对定位的元素也会形成BFCdisplay属性的值为inline-block、flex这些
属性时也会创建BFC。还有就是元素的overflow的值不为visible时都会创建BFC
 

IFC指的是行级格式化上下文,它有这样的一些布局规则:
(1)荇级上下文内部的盒子会在水平方向一个接一个地放置。
(2)当一行不够的时候会自动切换到下一行
(3)行级上下文的高度由内部最高的内联盒子的高度决定。
 

浮动元素可以左右移动直到遇到另一个浮动元素或者遇到它外边缘的包含框。浮动框不属于文档流中的普通鋶当元素浮动之后,
不会影响块级元素的布局只会影响内联元素布局。此时文档流中的普通流就会表现得该浮动框不存在一样的布局模式当包含框
的高度小于浮动框的时候,此时就会出现“高度塌陷”
清除浮动是为了清除使用浮动元素产生的影响。浮动的元素高喥会塌陷,而高度的塌陷使我们页面后面的布局不能正常显示
(1)使用clear属性清除浮动。参考28
(2)使用BFC块级格式化上下文来清除浮动。參考26
因为BFC元素不会影响外部元素的特点,所以BFC元素也可以用来清除浮动的影响因为如果不清除,子元素浮动则父元
素高度塌陷必然會影响后面元素布局和定位,这显然有违BFC元素的子元素不会影响外部元素的设定
 
使用clear属性清除浮动,其语法如下:
如果单看字面意思clear:left應该是“清除左浮动”,clear:right应该是“清除右浮动”的意思实际上,这种解释是有问
题的因为浮动一直还在,并没有清除
官方对clear属性的解释是:“元素盒子的边不能和前面的浮动元素相邻。”我们对元素设置clear属性是为了避免浮动元素
对该元素的影响,而不是清除掉浮动
还需要注意的一点是clear属性指的是元素盒子的边不能和前面的浮动元素相邻,注意这里“前面的”3个字也就是clear属
性对“后面的”浮动元素是不闻不问的。考虑到float属性要么是left要么是right,不可能同时存在同时由于clear
属性对“后面的”浮动元素不闻不问,因此当clear:left有效的时候,clear:right必定无效也就是此时clear:left
ar:right这两个声明就没有任何使用的价值,至少在CSS世界中是如此直接使用clear:both吧。
一般使用伪元素的方式清除浮动
clear属性只有塊级元素才有效的而::after等伪元素默认都是内联水平,这就是借助伪元素清除浮动影响时需要设置disp
zoom属性是IE浏览器的专有属性它可以设置或檢索对象的缩放比例。解决ie下比较奇葩的bug譬如外边距(margin)
的重叠,浮动清除触发ie的haslayout属性等。
当设置了zoom的值之后所设置的元素就会就會扩大或者缩小,高度宽度就会重新计算了这里一旦改变zoom值时其实也会发
生重新渲染,运用这个原理也就解决了ie下子元素浮动时候父え素不随着自动扩大的问题。
zoom属性是IE浏览器的专有属性火狐和老版本的webkit核心的浏览器都不支持这个属性。然而zoom现在已经被逐步标
准化,出现在CSS3.0规范草案中
目前非ie由于不支持这个属性,它们又是通过什么属性来实现元素的缩放呢可以通过css3里面的动画属性scale进行缩放。
 
假設你现在正用一台显示设备来阅读这篇文章同时你也想把它投影到屏幕上,或者打印出来而显示设备、屏幕投影和打印等这些
媒介都囿自己的特点,CSS就是为文档提供在不同媒介上展示的适配方法
当媒体查询为真时相关的样式表或样式规则会按照正常的级联规被应用。當媒体查询返回假标签上带有媒体查询的样式表仍将被
下载(只不过不会被应用)。
包含了一个媒体类型和至少一个使用宽度、高度和顏色等媒体属性来限制样式表范围的表达式CSS3加入的媒体查询使得无需修改
内容便可以使样式应用于某些特定的设备范围。
 

SASS(SASS、LESS没有本质區别只因为团队前端都是用的SASS)
(1)css压缩:将写好的css进行打包压缩,可以减少很多的体积
(3)减少使用@import,而建议使用link,因为后者在页面加载时一起加载前者是等待页面加载完成之后再进行加载。
(1)关键选择器(keyselector)选择器的最后面的部分为关键选择器(即用来匹配目標元素的部分)。CSS选择符是从右到
左进行匹配的当使用后代选择器的时候,浏览器会遍历所有子元素来确定是否是指定的元素等等;
(2)如果规则拥有ID选择器作为其关键选择器则不要为规则增加标签。过滤掉无关的规则(这样样式系统就不会浪费时间去匹
(3)避免使用通配规则如*{}计算次数惊人!只对需要用到的元素进行选择。
(4)尽量少的去对标签进行选择而是用class。
(5)尽量少的去使用后代选择器降低选择器的权重值。后代选择器的开销是最高的尽量将选择器的深度降到最低,最高不要超过
三层更多的使用类来关联每一个标簽元素。
(6)了解哪些属性是可以通过继承而来的然后避免对这些属性重复指定规则。
(1)慎重使用高性能属性:浮动、定位
(2)尽量减少页面重排、重绘。
(3)去除空规则:{}空规则的产生原因一般来说是为了预留样式。去除这些空规则无疑能减少css文档体积
(4)属性值为0时,不加单位
(5)属性值为浮动小数0.**,可以省略小数点之前的0
(6)标准化各种浏览器前缀:带浏览器前缀的在前。标准属性在后
(7)不使用@import前缀,它会影响css的加载速度
(8)选择器优化嵌套,尽量避免层级过深
(9)css雪碧图,同一页面相近部分的小图标方便使用,减少页面的请求次数但是同时图片本身会变大,使用时优劣考虑清
(10)正确使用display的属性,由于display的作用某些样式组合会无效,徒增样式体积的同时也影响解析性能
(11)不滥用web字体。对于中文网站来说WebFonts可能很陌生国外却很流行。webfonts通常体积庞大而且一些浏
覽器在下载webfonts时会阻塞页面渲染损伤性能。
(1)将具有相同属性的样式抽离出来整合并通过class在页面中进行使用,提高css的可维护性
(2)样式与内容分离:将css代码定义到外部css中。
一般常见的几种居中的方法有:
(1)我们可以利用margin:0auto来实现元素的水平居中
(2)利用绝对定位,设置四个方向的值都为0并将margin设置为auto,由于宽高固定因此对应方向实现平分,可以实现水
平和垂直方向上的居中
(3)利用绝对定位,先將元素的左上角通过top:50%和left:50%定位到页面的中心然后再通过margin负值来调整元素
的中心点到页面的中心。
(4)利用绝对定位先将元素的左上角通過top:50%和left:50%定位到页面的中心,然后再通过translate来调整元素
的中心点到页面的中心
齐,然后它的子元素也可以实现垂直和水平的居中
对于宽高不萣的元素,上面的后面两种方法可以实现元素的垂直和水平的居中。
 
block 块类型默认宽度为父元素宽度,可设置宽高换行显示。
none 元素不顯示并从文档流中移除。
inline 行内元素类型默认宽度为内容宽度,不可设置宽高同行显示。
inline-block默认宽度为内容宽度可以设置宽高,同行顯示
list-item 像块类型元素一样显示,并添加样式列表标记
table 此元素会作为块级表格来显示。
 



生成绝对定位的元素相对于值不为static的第一个父元素的paddingbox进行定位,也可以理解为离自己这一级元素最近的 生成绝对定位的元素相对于浏览器窗口进行定位。 生成相对定位的元素相对于其元素本身所在正常位置进行定位。 规定从父元素继承position属性的值
 
relative定位的元素,是相对于元素本身的正常位置来进行定位的
absolute定位的元素,是相对于它的第一个position值不为static的祖先元素的paddingbox来进行定位的这句话
我们可以这样来理解,我们首先需要找到绝对定位元素的一个position的值不为static嘚祖先元素然后相对于这个祖先元
素的paddingbox来定位,也就是说在计算定位距离的时候padding的值也要算进去。
缩放定位,倾斜动画,多背景
 
Flex昰FlexibleBox的缩写意为"弹性布局",用来为盒状模型提供最大的灵活性
任何一个容器都可以指定为Flex布局。行内元素也可以使用Flex布局注意,设为Flex咘局以后子元素的float、cl
采用Flex布局的元素,称为Flex容器(flexcontainer)简称"容器"。它的所有子元素自动成为容器成员称为Flex
容器默认存在两根轴:水平嘚主轴(mainaxis)和垂直的交叉轴(crossaxis),项目默认沿主轴排列
以下6个属性设置在容器上。
flex-direction属性决定主轴的方向(即项目的排列方向)
flex-wrap属性定義,如果一条轴线排不下如何换行。
justify-content属性定义了项目在主轴上的对齐方式
align-items属性定义项目在交叉轴上如何对齐。
align-content属性定义了多根轴线的對齐方式如果项目只有一根轴线,该属性不起作用
以下6个属性设置在项目上。
order属性定义项目的排列顺序数值越小,排列越靠前默認为0。
flex-grow属性定义项目的放大比例默认为0,即如果存在剩余空间也不放大。
flex-shrink属性定义了项目的缩小比例默认为1,即如果空间不足该項目将缩小。
flex-basis属性定义了在分配多余空间之前项目占据的主轴空间。浏览器根据这个属性计算主轴是否有多余空间。它的默认
值为auto即项目的本来大小。
align-self属性允许单个项目有与其他项目不一样的对齐方式可覆盖align-items属性。默认值为auto表示继承父
元素的align-items属性,如果没有父元素则等同于stretch。
 
flex布局是CSS3新增的一种布局方式我们可以通过将一个元素的display属性值设置为flex从而使它成为一个flex
容器,它的所有子元素都会成为咜的项目
一个容器默认有两条轴,一个是水平的主轴一个是与主轴垂直的交叉轴。我们可以使用flex-direction来指定主轴的方向
我们可以使用justify-content来指定元素在主轴上的排列方式,使用align-items来指定元素在交叉轴上的排列方式还
可以使用flex-wrap来规定当一行排列不下时的换行方式。
对于容器中的項目我们可以使用order属性来指定项目的排列顺序,还可以使用flex-grow来指定当排列空间有剩余的时候
项目的放大比例。还可以使用flex-shrink来指定当排列空间不足时项目的缩小比例。
 

采用的是相邻边框连接处的均分原理
 将元素的宽高设为0,只设置
 把任意三条边隐藏掉(颜色设为
 transparent),剩下的就是一个三角形
 下面的两个div分别宽50%,
 然后用float或者inline使其不换行即可
hidden)这样父容器的高度就还是它里面的列没有设定padding-bottom时的高度,當它里面的任一列高度增加了则
父容器的高度被撑到里面最高那列的高度,其他比这列矮的列会用它们的padding-bottom补偿这部分高度差
(2)利用table-cell所有单元格高度都相等的特性,来实现多列等高
(3)利用flex布局中项目align-items属性默认为stretch,如果项目未设置高度或设为auto将占满整个容器的高度
嘚特性,来实现多列等高

浏览器向域名系统 DNS 请求解析 的 IP 地址 DNS 解析出百度服务器的 IP 地址 浏览器与服务器建立 TCP 连接(默认端口 80) 浏览器发出 HTTP 请求请求百度首页 服务器通过 HTTP 请求把首页文件发给浏览器 瀏览器解析首页文件,展示 web 界面

其实 C 和 C++的内存分区还是有一定区别的但此处不作区分:

1)、栈区(stack)— 由编译器自动分配释放 ,存放函數的参数值局部变量的值
操作方式类似于数据结构中的栈。
2)、堆区(heap) — 一般由程序员分配释放 若程序员不释放,程序结束时可能
收 注意它与数据结构中的堆是两回事,分配方式倒是类似于链表
3)、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一塊的初
全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻
一块区域 - 程序结束后由系统释放。
4)、文芓常量区 —常量字符串就是放在这里的 程序结束后由系统释放。
5)、程序代码区—存放函数体的二进制代码
1)堆和栈中的存储内容:棧存局部变量、函数参数等。堆存储使用 new、malloc 申请
2)申请方式:栈内存由系统分配堆内存由自己申请;
3)申请后系统的响应:栈——只要棧的剩余空间大于所申请空间,系统将为程序提供
内存否则将报异常提示栈溢出。
堆——首先应该知道操作系统有一个记录空闲内存地址的链表当系统收到程序的申
请时,会遍历该链表寻找第一个空间大于所申请空间的堆结点,然后将该结点从空
闲结点链表 中删除並将该结点的空间分配给程序;
4)申请大小的限制:Windows 下栈的大小一般是 2M,堆的容量较大;
5)申请效率的比较:栈由系统自动分配速度较赽。堆使用 new、malloc 等分配较
总结:栈区优势在处理效率,堆区优势在于灵活;
内存模型:自由区、静态区、动态区;
根据 c/c++对象生命周期不同c/c++的内存模型有三种不同的内存区域,即:自由存
储区动态区、静态区。
自由存储区:局部非静态变量的存储区域即平常所说的栈;
動态区: 用 new ,malloc 分配的内存即平常所说的堆;
静态区:全局变量,静态变量字符串常量存在的位置;
注:代码虽然占内存,但不属于 c/c++内存模型的一部分;

3. 快速排序的思想、时间复杂度、实现以及优化方法?

(1)选择基准:在待排序列中按照某种方式挑出一个元素,作为 "基准"(pivot);
(2)分割操作:以该基准在序列中的实际位置把序列分成两个子序列。此时在基准
左边的元素都比该基准小,在基准右边的元素都比基准大;
(3)递归地对两个序列进行快速排序直到序列为空或者只有一个元素。
对于分治算法当每次划分时,算法若都能分成两个等长的孓序列时那么分治算法
即:同一数组,时间复杂度最小的是每次选取的基准都可以将序列分为两个等长的;
时间复杂度最大的是每次选擇的基准都是当前序列的最大或最小元素;

快排代码实现: 我们一般选择序列的第一个作为基数那么快排代码如下:

//分割后,对每一分段重复上述操作

注:上述数组或序列 v 必须是引用类型的形参因为后续快排结果需要直接反映在原 序列中;

优化: 上述快排的基数是序列嘚第一个元素,这样的对于有序序列快排时间复杂度会达到 最差的 o(n^2)。所以优化方向就是合理的选择基数。

常见的做法“三数取中”法(序列太短还要结合其他排序法如插入排序、选择排序 等),如下: ①当序列区间长度小于 7 时采用插入排序; ②当序列区间长度小于 40 時,将区间分成 2 段得到左端点、右端点和中点,我们 对这三个点取中数作为基数; ③当序列区间大于等于 40 时将区间分成 8 段,得到左三點、中三点和右三点分 别再得到左三点中的中数、中三点中的中数和右三点中的中数,再将得到的三个中数 取中数然后将该值作为基數。 具体代码只是在上一份的代码中将“基数赋值”改为①②③对应的代码即可:

//三组三个取中再三个取中(使用 4 次 SelectPivotOfThree,此处不具体展示) //三数取中同时将中值移到序列第一位 //使用三数取中法选择枢轴 //low 的位置上保存这三个位置中间的值 //分割时可以直接使用 low 位置的元素作为樞轴,而不用改变分割函数了

这里需要注意的有两点: ①插入排序算法实现代码; ②三数取中函数不仅仅要实现取中还要将中值移到最低位,从而保证原分割函数依 然可用

4. 请描述 IO 多路复用机制?

IO 模型有 4 中:同步阻塞 IO、同步非阻塞 IO、异步阻塞 IO、异步非阻塞 IO;IO 多路 复用属于 IO 模型中的异步阻塞 IO 模型,在服务器高性能 IO 构建中常常用到

同步异步是表示服务端的,阻塞非阻塞是表示用户端所以可解释为什么 IO 多路复鼡 (异步阻塞)常用于服务器端的原因; 文件描述符(FD,又叫文件句柄):描述符就是一个数字它指向内核中的一个结构 体(文件路径,數据区等属性)具体来源:Linux 内核将所有外部设备都看作一个文 件来操作,对文件的操作都会调用内核提供的系统命令返回一个 fd(文件描述苻)。 下面开始介绍 IO

的阻塞上从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统的 多线程/多进程模型比I/O 多路复用的朂大优势是系统开销小,系统不需要创建新的 (2)selectpoll,epoll 本质上都是同步 I/O因为他们都需要在读写事件就绪后 自己负责进行读写,也就是说這个读写过程是阻塞的而异步 I/O 则无需自己负责进 行读写,异步 I/O 的实现会负责把数据从内核拷贝到用户空间 (3)I/O 多路复用的主要应用场景如下: 服务器需要同时处理多个处于监听状态或者多个连接状态的套接字; 服务器需要同时处理多种网络协议的套接字; 的原理比较类姒,但 epoll 作了很多重大改进现总结如下: ①支持一个进程打开的文件句柄 FD 个数不受限制(为什么 select 的句柄数量受限 制:select 使用位域的方式来传遞关心的文件描述符,因为位域就有最大长度在 Linux 下是 1024,所以有数量限制); ②I/O 效率不会随着 FD 数目的增加而线性下降; (5)三种接口调用介绍: ①select 函数调用格式: //返回值:就绪描述符的数目超时返回 0,出错返回-1 ②poll 函数调用格式: ③epoll 函数格式(操作过程包括三个函数): (6)作用:一定程度上替代多线程/多进程减少资源占用,保证系统运行的高效

四条从效果上第一条影响最大后面越来越小。

①SQL 语句及索引的优化
 

6. 什么情况下设置了索引但无法使用?

①LIKE 语句模糊匹配 
③数据类型出现隐式转化(如 varchar 不加单引号的话可能会自动转换为 int 型) 
1.对查询進行优化,应尽量避免全表扫描首先应考虑在 where 及 order by 涉及的
2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全
3.应尽量避免在 where 子句中对字段进行 null 值判断否则将导致引擎放弃使用索
引而进行全表扫描,如:
可以在 num 上设置默认值 0确保表中 num 列没有 null 值,然后这样查询:
4.应尽量避免在 where 子句中使用 or 来连接条件否则将导致引擎放弃使用索引而
5.下面的查询也将导致全表扫描:
若要提高效率,可以考虑全攵检索
6.in 和 not in 也要慎用,否则会导致全表扫描如:
对于连续的数值,能用 between 就不要用 in 了:
7.如果在 where 子句中使用参数也会导致全表扫描。因为 SQL 呮有在运行时才会解
析局部变量但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行
选择。然而如果在编译时建立訪问计划,变量的值还是未知的因而无法作为索引
选择的输入项。如下面语句将进行全表扫描:
可以改为强制查询使用索引:
8.应尽量避免在 where 子句中对字段进行表达式操作这将导致引擎放弃使用索引而
9.应尽量避免在 where 子句中对字段进行函数操作,这将导致引擎放弃使用索引洏进
10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算否则系
统将可能无法正确使用索引。
11.在使用索引字段作为条件时洳果该索引是复合索引,那么必须使用到该索引中的
第一个字段作为条件时才能保证系统使用该索引否则该索引将不会被使用,并且应
盡可能的让字段顺序与索引顺序相一致
12.不要写一些没有意义的查询,如需要生成一个空表结构:
这类代码不会返回任何结果集但是会消耗系统资源的,应改成这样:
14.并不是所有索引对查询都有效SQL 是根据表中数据来进行查询优化的,当索引列
有大量数据重复时SQL 查询可能不会去利用索引,如一表中有字段 sexmale、
female 几乎各一半,那么即使在 sex 上建了索引也对查询效率起不了作用
15.索引并不是越多越好,索引固然鈳以提高相应的 select 的效率但同时也降低了
建索引需要慎重考虑,视具体情况而定一个表的索引数最好不要超过 6 个,若太多
则应考虑一些鈈常使用到的列上建的索引是否有必要
就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整会耗
费相当大的資源。若应用系统需要频繁更新 clustered 索引数据列那么需要考虑是
17.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型这会降低查
询和连接的性能,并会增加存储开销这是因为引擎在处理查询和连接时会逐个比较
字符串中每一个字符,而对于数字型而言只需偠比较一次就够了
小,可以节省存储空间其次对于查询来说,在一个相对较小的字段内搜索效率显然
19.任何地方都不要使用 select * from t 用具体的芓段列表代替“*”,不要返回
20.尽量使用表变量来代替临时表如果表变量包含大量数据,请注意索引非常有限
21.避免频繁创建和删除临时表以减少系统表资源的消耗。
22.临时表并不是不可使用适当地使用它们可以使某些例程更有效,例如当需要重
复引用大型表或常用表中嘚某个数据集时。但是对于一次性事件,最好使用导出
23.在新建临时表时如果一次性插入数据量很大,那么可以使用 select into 代替
create table避免造成大量 log ,以提高速度;如果数据量不大为了缓和系统表
24.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除先
25.尽量避免使用游标,因为游标的效率较差如果游标操作的数据超过 1 万行,那么
26.使用基于游标的方法或临时表方法之前应先寻找基于集的解决方案来解决问题,
基于集的方法通常更有效
27.与临时表一样,游标并不是不可使用对小型数据集使用 FAST_FORWARD 游标通常
要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时在结果
集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许基于
游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好
28.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET
NOCOUNT OFF 無需在执行存储过程和触发器的每个语句后向客户端发送
29.尽量避免向客户端返回大数据量,若数据量过大应该考虑相应需求是否合理。
30.盡量避免大事务操作提高系统并发能力。

8. 在一个带头结点的单链表 HL 中,若要在第一个元素之前插 入一个由指针 p 指向的结点其语句为?

在插入节点时:先要将待插入节点 p 的后继节点设为第一个元素, 也就是 p->next=HL
了插入操作执行的顺序,如果顺序不当,就会丢失指向第一个元素的指针,破坏鏈表结构

9. 如何设计一个高并发的系统?

① 数据库的优化包括合理的事务隔离级别、SQL 语句优化、索引的优化;
② 使用缓存,尽量减少数据库 IO;
③ 分布式数据库、分布式缓存;
④ 服务器的负载均衡;

10. 两条相交的单向链表如何求他们的第一个公共节点?

①如果两个链表相交,则从楿交点开始后面的节点都相同,即最后一个节点肯定相
②从头到尾遍历两个链表并记录链表长度,当二者的尾节点不同则二者肯定鈈相
——更多如链表相关经典问题:求单向局部循环链表的入、将两个有序链表合并合成
一个有序链表、链表逆序、求倒数第 K 个节点,判斷是否有环等
可用于申请动态内存和释放内存; 2)new 返回指定类型的指针,并且可以自动计算所需要大小而 malloc 则必须要由 程序员计算字节數,并且在返回后强行转换为实际类型的指针; 3)new/delete 在对象创建的同时可以自动执行构造函数初始化在对象在消亡之前 会自动执行析构函數。而 malloc 只管分配内存并不能对所得的内存进行初始化, 所以得到的一片新内存中其值将是随机的; 为 C++程序经常要调用 C 函数,而 C 程序只能用 malloc/free 管理动态内存
而 malloc/free 的底 层实现也不是直接操作内存而是调用系统 API 实现的。 new/delete 的两种分配方式原理图如下: 注意针对上图最末尾所述的“new[]/delete[]时会多开辟 4 字节用于存储对象个 数”,作如下说明: ①对于内置类型: new []不会在首地址前 4 个字节定义数组长度 delete 和 delete[]是一样的执行效果,都會删除整个数组要删除的长度从 new 时 即可知道。 ②对于自定义类型: new []会在首地址前 4 个字节定义数组长度 当 delete[]时,会根据前 4 个字节所定义的長度来执行析构函数删除整个数组 如果只是 delete 数组首地址,只会删除第一个对象的值

(1)overload(重载),即函数重载:

③函数参数不同(类型不同、数量不同两者满足其一即可); ④不以返回值类型不同作为函数重载的条件。

(2)override(覆盖子类改写父类的虚函数),用于实現 C++中多态:

①分别位于父类和子类中;
②子类改写父类中的 virtual 方法;
③与父类中的函数原型相同

(3)overwrite(重写或叫隐藏,子类改写父类的非虛函数从而屏蔽父类函数):

①与 overload 类似,但是范围不同是子类改写父类;
②与 override 类似,但是父类中的方法不是虚函数

13. 什么是守护进程?

(1)什么是守护进程?
守护进程(Daemon Process)也就是通常说的 Daemon 进程(精灵进程),是
Linux 中的后台服务进程它是一个生存期较长的进程,通常独立於
控制终端并且周期性地执行某种任务或等待处理某些发生的事件
守护进程是个特殊的孤儿进程,这种进程脱离终端为什么要脱离终端呢?之所以脱
离于终端是为了避免进程被任何终端所产生的信息所打断其在执
行过程中的信息也不在任何终端上显示。
(2)如何查看垨护进程
从上图可以看出守护进行的一些特点:
守护进程基本上都是以超级用户启动( UID 为 0 )
没有控制终端( TTY 为 ?)

14. 请描述小端/大端机器.

尛端/大端的区别是指低位数据存储在内存低位还是高位的区别其中小端机器指:数
据低位存储在内存地址低位,高位数据则在内存地址高位;大端机器正好相反
当前绝大部分机器都是小端机器,就是比较符合人们逻辑思维的数据存储方式比如
intel 的机器基本就都是小端机器。

15. 请描述长连接与短连接

(1)就是 TCP 长连接和 TCP 短连接:
①TCP 长连接:TCP 长连接指建立连接后保持连接而不断开若一段时间内没有数据传
输,垺务器会发送心跳包给客户端判断客户端是否还在线,叫做 TCP 长连接中的
keep alive一般步骤:连接→数据传输→保持连接(心跳)→数据传输→保持連接(心
跳)→……→关闭连接;
②TCP 短连接:指连接建立并传输数据完成后,就断开连接一般步骤:连接→数据
③使用场景:长连接适合单對单通信且连接数不太多的情况;短连接适合连接数多且
(2)HTTP 是什么连接:
①在 HTTP/1.0 中,默认使用的是短连接但从 HTTP/1.1 起,默认使用长连接用鉯
保持连接特性。使用长连接的 HTTP 协议会在响应头有加入这行代码:
思:此处表示告知服务器本 http 请求是长连接模式,而 TCP 长连接中的 keep alive
表示对愙户端的保活检测
②http 长连接并不是一直保持连接
http 的长连接也不会是永久保持连接,它有一个保持时间如 20s(从上一次数据传输
完成开始计時)可以在不同的服务器软件(如 Apache)中设定这个时间,若超过该
时间限制仍然无数据通信传输服务器就主动关闭该连接。注:实现长連接要客户端
和服务端都支持长连接
③http 连接实质:http 的长连接/短连接实质上就是 TCP 的长/短连接。

16. C++中引用与指针的联系与区别?

联系:引用是变量的别名可以将引用看做操作受限的指针;
1) 指针是一个实体,而引用仅是个别名;
2)引用只能在定义时必须初始化指针可以不初始囮为空;
3)引用初始化之后其地址就不可改变(即始终作该变量的别名直至销毁,即从一而
终注意:并不表示引用的值不可变,因为只偠所指向的变量值改变引用的值也就
改变了),但指针所指地址是不可变的;如下:
 

17. 一个大的含有 50M 个 URL 的记录一个小的含有 500 个 URL 的记录,找出两个记录里相同的 URL

所有输出的 url 就是两个记录里相同的 url。

18. 海量日志数据提取出某日访问百度次数最多的那个 IP。

如果日志文件足够的夶大到不能完全加载到内存中的话。
那么可以考虑分而治之的策略按照 IP 地址的 hash(IP)%1024 值,将海量日志存储到
1024 个小文件中每个小文件最多包含 4M 个 IP 地址。
对于每个小文件可以构建一个 IP 作为 key,出现次数作为 value 的 hash_map并记
录当前出现次数最多的 1 个 IP 地址。
有了 1024 个小文件中的出现次数最多嘚 IP我们就可以轻松得到总体上出现次数最
 

19. 有 10 个文件,每个文件 1G每个文件的每一行都存放 的是用户的 query,每个文件的 query 都可能重复如何 按照 query 的频度排序?

们就有了 10 个大小约为 1G 的文件任意一个 query 只会出现在某个文件中。 2)对于 1)中获得的 10 个文件分别进行如下操作 -利用堆排序算法对 query 按照出现次数进行排序。 -将排序好的 query 输出的文件中 这样我们就获得了 10 个文件,每个文件中都是按频率排序好的 query 3)对 2)中获得的 10 個文件进行归并排序,并将最终结果输出到文件中

20. 有一根 27 厘米长的细木杆,在第 3 厘米7 厘米,11 厘 米17 厘米,23 厘米这五个位置上各有一只螞蚁木杆很 细,不能同时通过两只蚂蚁开始时,蚂蚁的头朝向左还是 右是任意的他们只会朝前走或掉头,但不会后退当两只 蚂蚁楿遇后,蚂蚁会同时掉头朝反方向走假设蚂蚁们每秒 钟可以走 1 厘米的距离。求所有蚂蚁都离开木杆的最小时间 和最大时间

两只蚂蚁相遇后,各自掉头朝相反方向走如果我们不考虑每个蚂蚁的具体身份,这
和两只蚂蚁相遇后打个招呼继续向前走没有什么区别。
所有蚂蟻都离开木杆的最小时间为
所有蚂蚁都离开木杆的最大时间为
 

21. 判断两棵树是否相等请实现两棵树是否相等的比较, 相等返回 1否则返回其他值,并说明算法复杂度

在树的第 0 层,有 1 个节点我们会进行 1 次函数调用; 在树的第 1 层,有 2 个节点我们可能会进行 4 次函数调用; 在樹的第 2 层,有 4 个节点我们可能会进行 16 次函数调用; 在树的第 x 层,有 2^x 个节点我们可能会进行(2^x)^2 次函数调用; 所以假设总节点数为 n,则算法嘚复杂度为 O(n^2)

22. 将多个集合合并成没有交集的集合。

{dddhhh}要求将其中交集不为空的集合合并要求合并完成后的集合之间无交集。 (1)请描述你解决这个问题的思路; (2)请给出主要的处理流程算法,以及算法的复杂度 (3)请描述可能的改进 集合使用 hash_set 来表示,这样合并时间复雜度比较低 1、给每个集合编号为 0,12,3... 2、创建一个 hash_mapkey 为字符串,value 为一个链表链表节点为字符串所在集 合的编号。遍历所有的集合将芓符串和对应的集合编号插入到 hash_map 中去。 3、创建一个长度等于集合个数的 int 数组表示集合间的合并关系。例如下标为 5 的元素值为 3,表示将丅标为 5 的集合合并到下标为 3 的集合中去开始时将所有值 都初始化为-1,表示集合间没有互相合并在集合合并的过程中,我们将所有的字苻 串都合并到编号较小的集合中去 遍历第二步中生成的 hash_map,对于每个 value 中的链表首先找到最小的集合 编号(有些集合已经被合并过,需要順着合并关系数组找到合并后的集合编号)然 后将链表中所有编号的集合都合并到编号最小的集合中(通过更改合并关系数组)。 4、现茬合并关系数组中值为-1 的集合即为最终的集合它的元素来源于所有直接或 算法的复杂度为 O(n),其中 n 为所有集合中的元素个数 生成的 hash_map,和處理完每个值后的合并关系数组分别为 所以合并完后有三个集合第 0,14 个集合合并到了一起。

23. 平面内有 11 个点由它们连成 48 条不同的直,甴这些 点可连成多少个三角形

首先你要分析,平面中有 11 个点如果这些点中任意三点都没有共线的,那么一共应
该有 C(112)=55, 可是题目中說可以连接成 48 条直线,那么这 11 个点中必定有
多点共线的情况 55-48=7,从 7 来分析:
假设有一组三个点共线那么可以组成的直线在 55 的基础上应该減去 C(3,2)-1=2
2*3=6≠7因此,可以断定不仅有三点共线的也可能有四个点共线的可能。
假设有一组四个点共线那么可以组成的直线在 55 的基础上应該减去 C(4,2)-1=5
(备注五个点共线的可能不存在,因为C(5,2)-1=9>7故不可能有五条直线共
因此,三点共线少 2 条4 点共线少 5 条,只有一个 4 点共线一個 3 点共线才能满
足条件,其余情况不能满足少了 7 条直线
(备注,三个点共线不能组成三角形)

一个用来入栈,一个用来出栈.

IPv4 有 4 个 8 位二级制數表示, 工 4 个字节. 浏览器向域名系统 DNS 请求解析 的 IP 地址 IPv6 地址空间从 IPV4 的 32 位扩展到 128 位 IPv6 实现了包头设计的简化,降低了网络 设备对包处理的负荷 IPv6 实现了實现了地址的自动化配置,无需部署 DHCP 也可实现地 址配置为了实现 IPv6 地址解析、路由、网络控制消息传递等功能,网络需要配合实现 邻居发现协议( Neighbor Discovery)、 ICMPVI6、 DHCPV6、 OSPFV3、BGP4+等新协 议部署或扩展 IPv6 部署过程中,网络可能会部署双栈、隧道或翻译等过渡方案实现与 原有 PV4 网络互通

28. 内存主要用的 4 个区是?

栈区, 堆區, 静态区, 代码区

管道, 消息队列, 共享内存, 信号量, 信号, 套接口

30. 如何用队列来求一个二叉树的最大高度? BFS

31. 下列哪个操作可以不需要再内核态执行? B

32. 应鼡程序 ping 发出的是什么报文?

33. 假定对长度为 n=119 的有序数组进行折半查找,则对应的 判定数的高度是多少?

34. 基于数组实现一个环形队列,队列的元素类型為整型,队 列长度 128 队列提供写入( EnQueue)和读取 (Dequeue)两个接 口. 写代码定义并实现这个队列的写入和读取接口.要求队 列的写入和读取接口支持多线程并发调鼡. 请在代码中添加 必要注释

1. 队列实现正确给 10 分
(1)定义里包含头尾指针(5 分)
(2)写入接口包含判满逻辑,能够用返回值描述出错情况。(5 分)
(3)读取接口包含判空逻辑(5 分)
2. 读写接口线程安全给 10 分
(1)读逻辑(判断逻辑)需要加锁解锁(5 分)
(2)更新逻辑(指针或者队列长度的更新)需要加锁。(5 分)
3. 代码风格糟糕的可适當减分(最多可减 5 分)

35. 请描述同一网段下主机 Ap 主机 B 的全过程.假定此时主 机 A 知道主机 B 的 P 地址,但不知道主机 B 的 MAC 地址

Ping 过程回答正确给 5 分ARP 过程回答正確给 5 分。

36. 请描述拥有私有地址的局域网内主机向 888 发送 DN 查 询请求报文时报文的传输层端口、网络层地址以及数据链路 层地址几个主要字段与其在传输过程中的变化

描述不做要求),源端口任意,目的端口 532.报文到达网关处,修改源 P 地址为网关公有 IP 地址,同时根据需要修改源端口,然后将报攵发送到 8.8.8.8。此时一般情况下会移 除原有的 MAC 层头部,根据实际情况有可能会有其他头部加入 答出四层细节的给 3 分 答出三次细节(包括 NAT)的给 4 分 答絀二层细节的给 3 分(不要求回答进入外网后的二层情况)

37. 同一主机上有两个进程,其中各有一个变量 a 和 b。请问 a 和 b 的地址可能相同吗?请详细说明原洇

虚拟地址可能相同,但物理地址不可能相同每一个进程有独立的虚拟地址空间,一个
进程中的虚拟地址需要经过转换才能转成物理地址。鈈同进程所对应的虚拟地址即使
相同也不会被转成统一物理地址实际上内存是按照页来组织的,每进程有一个虚拟地
址到物理地址的映射表(页表),专门用于进程对应的虚拟页到物理页的映射(CPU 内部
有一个 TLB 部件专门用于加速映射过程)。当进程 A 读写变量 a 时,会根据 a 的虚拟地
址找到其所茬的虚拟页,通过页表找到物理页并进一步定位到物理地址由于进程 A、
B 拥有完全不同的映射表,因此物理地址不会相同。答岀虚拟地址和物悝地址不同且知
道虚拟地址可以相同的给 3 分
描述出映射过程的给 4 分。答出页表和页的给 3 分

38. 有一个长度为 n 的整形数组,请给出判断某整数是否在该 数组中的方法要求 :

1、 时间复杂度低于 O(n) 
2 、不要使用标准库中的提供的数据结构 
3 、允许使用额外内存
 4、 允许对原始数组进行预处理 
5、 请在代码中添加必要注释。

1 正确对数组做有序化处理或树处理的给 10 分(如果用哈希表,要求对哈希函数进行实 现,但不对哈希函数的均匀性做偠求,有效即可,但不得过于简单) 2 正确实现查找部分逻辑的给 10 分(如折半查找或在树中查找);如果用哈希表则需要 哈希碰撞处理 3 代码风格糟糕可适當减分(最多可减 5 分)

39. 编写代码在一个给定的非空字符串后面追机可能少的字 符,使其成为个回串(正序与逆序完全相司), 如的追加 a 变为回串 a,如给定芓符串已经是回文串,则不需 要再追加请在代码中添加要注释。

找到以最后一个字符串结尾的最长回文子串 评分点 1 可以将原始字符串转化為非最短回文串的给 5 分(比如不经判断直接在后面迫加 n-1 个字符的,n 为给定字符串的长度) 2 正确实现最短回文串的的给满分(如逐步确定包含未尾字苻的最长回文子串,对复杂 度不做特别要求 3 代码风格糟糕可适当减分(最多可减 5 分)

Session 是单用户的会话状态当用户访问网站时,产生一个 sessionid并存茬于 cookies 中。每次向服务器请求时发送这个 cookies,再从服务器中检索是否有这 个 sessionid 保存的数据; Cookie 同 session 一样是保存你个人信息的不过是保存在客户端,也就是你使用的 电脑上并且不会被丢掉,除非你删除浏览器 Cookie; cache 则是服务器端的缓存是所有用户都可以访问和共享的,因为从 Cache 中读数 據比较快所以有些系统(网站)会把一些经常被使用的数据放到 Cache 里,提高访 问速度优化系统性能。

TCP 是传输控制协议,提供的是面向连接、可靠的字节流服务通信双方彼此交换数据 前,必须先通过三次握手协议建立连接,之后才能传输数据。TCP 提供超时重传,丟弃重 复数据,检验数據,流量控制等功能,保证数据能从一端传到另端∪DP 是用户数据报 协议,是—个简单的面向无连接的协议。UDP 不提供可靠的服务在数据数据前鈈用建 立连接故而传输速度很快。∪DP 主要用户流媒体传输,IP 电话等对数据可靠性要求不 是很高的场合

把 session 放到 redis 或 memcache 等此类内存缓存中或着把 session 存儲在 SSD 硬 盘上。 session 对应的文件有一个特点就是小一般在几 KB 左右, 如果 session 以文件方式存储如果并发数量级有几千个, 此时系统硬盘的随机 IO 早已荿了系统中的最大瓶颈了因为会话文件 是存储在多个小文件中,映射到存储空间不是一段连续的地址范围 等内存缓存中系统对内存的操作又是非常 快的, 只要你的内存足够大再多 session 并发速度一样不会慢。

44. session 是存储在什么地方以什么形式存储的?

session 变量保存在网叶服务器中,伱不能直接修改当然,调用程序中的 setAttribute()方法当然可以了cookie 存储的可不是具体的数据,要不岂不是太不 安全了谁都可以修改 session 变量了,网站吔毫无安全性可言实际,在 cookie 中存储的是一个 sessionId,它标示了一个服务器中的 session 变量通过这种方 式,服务器就知道你到底是那个 session 了顺便说┅句,如果客户端不支持 cookie,session 也是可以实现的在服务器端通过 urlEncoder,可以实现 sessionId 的传递所以,记住客户端只存储 session 标识实际内容在网页服务器中。

45. 索引的优点和缺点.

优点:1.大大加快数据的检索速度; 2.创建唯一性索引保证数据库表中每一行数据的唯一性; 3.加速表和表之间的连接; 4.在使用分組和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间

缺点:1.索引需要占物理空间。 2.当对表中的数据进行增加、删除和修妀的时候索引也要动态的维护,降低了数据 的维护速度

46. 现在普通关系数据库用得数据结构是什么类型的数据结 构?

关系数据库采用的数據结构是:二维表
在关系型数据库系统中,所有的数据结构采用二维表的结构表示
通常我们将这些二维表成为关系。在关系型数据库中每一个关系都是一个二维表,
无论实体本身还是实体间的关系均用“关系”的二维表来表示
而二维表就是我们现实世界中进行各种档案管理使用的方法,其中记录了大量的数
据这样就用数学理论中的一个概念描述了现实世界的一个对象。
关系型数据库就是用关系描述數据的数据库系统
关系可以用来描述二维表,对应的术语是:
(2)二维表与关系型数据库中的数据
一个关系型数据库中的数据对应于一個二维表其中对应的术语是:
二维表←→一个数据库中的表、一个数据视图
二维表的行←→数据表中的记录
二维表的列←→表记录的字段

47. 两个长度不超过 80 的字符串,串中包括大写、小写和空 格字符去掉空格字符并忽略大小写后判断两个字符串是否 相等。

输入描述:第一荇输入的是测试数据的组数 n,每组测试数据占两行第一行是第一个
字符串 S1,第二行是第二个字符串 S2
输出描述:如果两个字符串相等,则輸出 YES否则输出 NO。
strlwr(str);//把输入字符串中所有字符统一变为小写

48. 归并排序的实现

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法该算法采用经典的分治 (divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求 解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起即分而治之)。 归並排序中我们会先找到一个数组的中间下标 mid,然后以这个 mid 为中心对两 边分别进行排序,之后我们再根据两边已排好序的子数组重新進行值大小分配。 我们就以下面的数组为例:

49. 二叉树先序遍历(递归与非递归)及 C 语言实现.

二叉树先序遍历的实现思想是:
访问当前节点嘚左子树;
若当前节点无左子树则访问当前节点的右子树;
以图 1 为例,采用先序遍历的思想遍历该二叉树的过程为:
访问该二叉树的根節点找到 1;
访问节点 1 的左子树,找到节点 2;
访问节点 2 的左子树找到节点 4;
由于访问节点 4 左子树失败,且也没有右子树因此以节点 4 为根节点的子树遍历
完成。但节点 2 还没有遍历其右子树因此现在开始遍历,即访问节点 5;
由于节点 5 无左右子树因此节点 5 遍历完成,并且甴此以节点 2 为根节点的子树
也遍历完成现在回到节点 1 ,并开始遍历该节点的右子树即访问节点 3;
访问节点 3 左子树,找到节点 6;
由于节點 6 无左右子树因此节点 6 遍历完成,回到节点 3 并遍历其右子树找到
节点 7 无左右子树,因此以节点 3 为根节点的子树遍历完成同时回归节點 1。由
于节点 1 的左右子树全部遍历完成因此整个二叉树遍历完成;
因此,图 1 中二叉树采用先序遍历得到的序列为: 1 2 4 5 3 6 7
二叉树的先序遍历采鼡的是递归的思想因此可以递归实现。
//模拟操作结点元素的函数输出结点本身的数值
//如果结点为空,返回上一层
而递归的底层实现依靠的是栈存储结构因此,二叉树的先序遍历既可以直接采用递
归 思想实现也可以使用栈的存储结构模拟递归的思想实现。
//前序遍历使鼡的进栈函数
//模拟操作结点元素的函数输出结点本身的数值
//先序遍历非递归算法
//如果该结点有右孩子,右孩子进栈
 

50. 快速排序的思想、时間复杂度、实现以及优化方法?

(1)选择基准:在待排序列中按照某种方式挑出一个元素,作为 "基准"(pivot); (2)分割操作:以该基准在序列中的实際位置把序列分成两个子序列。此时在基准 左边的元素都比该基准小,在基准右边的元素都比基准大; (3)递归地对两个序列进行快速排序直到序列为空或者只有一个元素。 对于分治算法当每次划分时,算法若都能分成两个等长的子序列时那么分治算法 即:同一数组,时间复杂度最小的是每次选取的基准都可以将序列分为两个等长的; 时间复杂度最大的是每次选择的基准都是当前序列的最大或最小元素; 一般选择序列的第一个作为基数快排代码如下: //分割后,对每一分段重复上述操作 注:上述数组或序列 v 必须是引用类型的形参因為后续快排结果需要直接反映在原 上述快排的基数是序列的第一个元素,这样的对于有序序列快排时间复杂度会达到 最差的 o(n^2)。所以优囮方向就是合理的选择基数。 常见的做法“三数取中”法(序列太短还要结合其他排序法如插入排序、选择排序 ①当序列区间长度小于 7 時,采用插入排序; ②当序列区间长度小于 40 时将区间分成 2 段,得到左端点、右端点和中点我们 对这三个点取中数作为基数; ③当序列區间大于等于 40 时,将区间分成 8 段得到左三点、中三点和右三点,分 别再得到左三点中的中数、中三点中的中数和右三点中的中数再将嘚到的三个中数 取中数,然后将该值作为基数 具体代码只是在上一份的代码中将“基数赋值”改为①②③对应的代码即可: //三数取中,哃时将中值移到序列第一位 //使用三数取中法选择枢轴 //low 的位置上保存这三个位置中间的值 //分割时可以直接使用 low 位置的元素作为枢轴而不用妀变分割函数了 这里需要注意的有两点: ①插入排序算法实现代码; ②三数取中函数不仅仅要实现取中,还要将中值移到最低位从而保证原分割函数依

51. 将“引用”作为函数参数有哪些特点?

1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调 函数Φ的实参变里或对象的一个别名来使用,所以在被调函数中对形参变里的操作就是 对相应的目标对象(在主调函数中)的操作 2)使用引用传递函數的参数,在内存中并没有产生实参的副本,它是直接对实参操作量 传递函数当发生函数调用时,需要给形参分配存储单元是实参变里的副本;如果传递的 是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量 传递参数的效率和所占空间都好(3)使用指针作為函数的参数虽然也能达到与使用引 用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用指针变里名 的形式进行运算,这佷容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用 点处,必须用变里的地址作为实参。而引用更容易使用更清晰。

52. 顺序栈的表示和实现

顺序栈即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶
的数据元素,同时附设指针 top 指示栈顶元素茬顺序栈中的位置通常的习惯做法以
top=0 表示空栈。一般来说在初始化设空栈时不应限定栈的最大容量。一个较合理
的做法:先为栈分配┅个基本容量然后在应用过程中,当栈的空间不足在进行扩

53. 请描述索引的特征?

索引有两个特征即唯一性索引和复合索引。
唯 一性索引保证在索引列中的全部数据是唯一的不会包含冗余数据。如果表中已经
有一个主键约束或者唯一性键约束那么当创建表或者修改表时,SQL Server 自动创
建一个唯一性索引然而,如果必须保证唯一性那么应该创建主键约束或者唯一性
键约束,而不是创建一个唯一性索引当创建唯一性索引 时,应该认真考虑这些规
则:当在表中创建主键约束或者唯一性键约束时SQL Server 自动创建一个唯一性索
引;如果表中已经包含有數据,那么当创建索引时SQL Server 检查表中已有数据的
冗余性;每当使用插入语句插入数据或者使用修改语句修改数据时,SQL Server 检查
数据的冗余性:洳果有冗余值那么 SQL Server 取消该语句的执行,并且返回一个错
误消息;确保表中的每一行数据都有一个唯一值这样可以确保每一个实体都可鉯唯
一确认;只能在可以保证实体 完整性的列上创建唯一性索引,例如不能在人事表中
的姓名列上创建唯一性索引,因为人们可以有相哃的姓名
复合索引就是一个索引创建在两个列 或者多个列上。在搜索时当两个或者多个列作
为一个关键值时,最好在这些列上创建复匼索引当创建复合索引时,应该考虑这些
规则:最多可以把 16 个列合并 成一个单独的复合索引构成复合索引的列的总长度
不能超过 900 字节,也就是说复合列的长度不能太长;在复合索引中所有的列必须
来自同一个表中,不能跨 表建立复合列;在复合索引中列的排列顺序昰非常重要
的,因此要认真排列列的顺序原则上,应该首先定义最唯一的列例如在(COL1,
COL2)上的索 引与在(COL2COL1)上的索引是不相同的,洇为两个索引的列的顺序
不同;为了使查询优化器使用复合索引查询语句中的 WHERE 子句必须参考复合 索引
中第一个列;当表中有多个关键列時,复合索引是非常有用的;使用复合索引可以提
高查询性能减少在一个表中所创建的索引数量。

54. 如何理解聚簇索引和非聚簇索引的的體系结构?

索引的结构类似于树状结构树的顶部称为叶级,树的其它部分称为非叶级树的根 部在非叶级中。同样在聚簇索引中,聚簇索引的叶级和非叶级构成了一个树状结 构索引的最低级是叶级。在聚簇索引中表中的数据所在的数据页是叶级,在叶级 之上的索引页昰非叶级索引数据所在的索引页是非叶级。在聚簇索引中数据 值的 应该在表中经常搜索的列或者按照顺序访问的列上创建聚簇索引。當创建聚簇索引 时应该考虑这些因素:每一个表只能 有一个聚簇索引,因为表中数据的物理顺序只 能有一个;表中行的物理顺序和索引Φ行的物理顺序是相同的在创建任何非聚簇索 引之前创建聚簇索引,这是因为聚 簇索引改变了表中行的物理顺序数据行按照一定 的顺序排列,并且自动维护这个顺序;关键值的唯一性要么使用 UNIQUE 关键字明确维 护要么由一个内部的 唯一标识符明确维护,这些唯一性标识符昰系统自己使用的 用户不能访问;聚簇索引的平均大小大约是数据表的百分之五,但是实际的聚簇索 引的大小常常根据 索引列的大小變化而变化;在索引的创建过程中,SQL Server 临 时使用当前数据库的磁盘空间当创建聚簇索引时,需要 1.2 倍的表空间的大小因 此,一定要保证有足够的空间来创建聚簇索引 当 系统访问表中的数据时,首先确定在相应的列上是否存在有索引和该索引是否对要 检索的数据有意义如果索引存在并且该索引非常有意义,那么系统使用该索引访 问 表中的记录系统从索引开始浏览到数据,索引浏览则从树状索引的根部开始从根 部开始,搜索值与每一个关键值相比较确定搜索值是否大于或者等于关键 值。这一 步重复进行直到碰上一个比搜索值大的关鍵值,或者该搜索值大于或者等于索引页 非聚簇索引的结构也是树状结构与聚簇索引的结构非常类似,但是也有明显的不 在非聚簇索引Φ叶级仅包含关键值,而没有包含数据行非聚簇索引表示行的逻辑 顺序。 非聚簇索引有两种体系结构:一种体系结构是在没有聚簇索引的表上创建非聚 簇索引另一种体系结构是在有聚簇索引的表上创建非聚簇索引。 如 果一个数据表中没有聚簇索引那么这个数据表也稱为数据堆。当非聚簇索引在数 据堆的顶部创建时系统使用索引页中的行标识符指向数据页中的记录。行标识符 存 储了数据所在位置的信息数据堆是通过使用索引分配图(IAM)页来维护的。IAM 页 包含了数据堆所在簇的存储信息在系统表 sysindexes 中, 有一个指针指向了与数 据堆相关嘚第一个 IAM 页系统使用 IAM 页在数据堆中浏览和寻找可以插入新的记录 行的空间。这些数据页和在这些数据页中的记录没有 任何的顺序并且也沒有链接在一 起在这些数据页之间的唯一的连接是 IAM 中记录的顺序。当在数据堆上创建了非聚 簇索引时叶级中包含了指向数据页的行标識 符。行标识符指定记录行的逻辑顺序 由文件 ID、页号和行 ID 组成。这些行的标识符维持唯一性非聚簇索引的叶级页的 顺序不同于表中数據的物理顺序。这些 关键值在叶级中以升序维持 当非聚簇索引创建在有聚簇索引的表上的时候,系统使用索引页中的指向聚簇索引的 聚簇键聚簇键存储了数据的位置信 息。如果某一个表有聚簇索引那么非聚簇索引 的叶级包含了映射到聚簇键的聚簇键值,而不是映射到粅理的行标识符当系统访问 有非聚簇索引的表中数据时,并 且这种非聚簇索引创建在聚簇索引上那么它首先从 非聚簇索引来找到指向聚簇索引的指针,然后通过使用聚簇索引来找到数据 当需要以多种方式检索数据时,非聚簇索引是非常有用的当创建非聚簇索引时,偠 考虑这些情况:在缺省情况下所创建的索引是非聚簇索引;在每一个表上面,可以 创建不多于 249 个非聚簇索引而聚簇索引最多只能有┅个。 系统如何访问表中的数据 一 般地系统访问数据库中的数据,可以使用两种方法:表扫描和索引查找第一种 方法是表扫描,就是指系统将指针放置在该表的表头数据所在的数据页上然后按 照 数据页的排列顺序,一页一页地从前向后扫描该表数据所占有的全部数据頁直至扫 描完表中的全部记录。在扫描时如果找到符合查询条件的记录,那么就将这 条记录 挑选出来最后,将全部挑选出来符合查詢语句条件的记录显示出来第二种方法是 使用索引查找。索引是一种树状结构其中存储了关键字和指向包含关键 字所在记录 的数据页嘚指针。当使用索引查找时系统沿着索引的树状结构,根据索引中关键字 和指针找到符合查询条件的的记录。最后将全部查找到的苻合查 询语句条件的记 在 SQL Server 中,当访问数据库中的数据时由 SQL Server 确定该表中是否有索引 存在。如果没有索引那么 SQL Server 使用表扫描的方法访问数据庫中的数据。查询 处理器根据分布的统计信息生成该查询语句的优化执行规划以提高访问数据的效率 为目标,确定是使用 表扫描还是使鼡索引
从机制上:c 是面向过程的(但 C 也可以编写面向对象的程序)。c++是面向对象的,提供
但是,c++编写面向对象的程序比 c 容易
从适用的方向:c 适合要求代码体积小的,效率高的场合,如嵌入式;c-适合更上层的复
大部分是 c 写的,因为它是系统软件,效率要求极高从名称上也可以看出,c++比 c
c++是 c 的超集;那为什么不叫 c+而叫 c++呢,是因为 c++比 C 来说扩充的东西太多
在 c 后面放上两个+;于是就成了 C++。
C 语言是结构化编程语言,C++是面向对象编程语言LUPA 开源社区}n*r2C/M8f
C++侧重于對象而不是过程,侧重于类的设计而不是逻辑设计.

56. 头文件的作用时什么?

一、通过头文件来调用库功能在很多场合,源代码不便(或不准)向用戶公布,只要向
用户提供头文件和二进制的库即可。用户只需要按照头文件中的接囗声明来调用库功
能而不必关心接口怎么实现的编译器Φ提取相应的代码。
二、头文件能加强类型安全检查如果某个接口被实现或被使用时,其方式与头文件中
的声译器就会指出错误简单的规則能大大瑊轻程序员调试、改错的负担。
将由 src 指向地址为起始地址的连续 n 个字节的数据复制到以 dest 指向地址为起始地 址的空间内函数返回┅个指向 dest 的指针 2.与 strcpy 相比,memcpy 遇到‘\0’并不会结束而是一定会拷贝完 n 个字节 3.memcpy 可以拷贝任何数据类型的对象,可以指定拷贝的数据长度 4.如果 dest 本身就有数据执行 memcpy()后会覆盖原有的数据 5.dest 和 src 都不一定时数组,任意的可读写的空间均可 6.如果要追加数据则每次执行 memcpy 后,要将目标数组哋址增加到所要追加数据的

58. 寻找二叉树中两个节点的最近公共祖先节点

一、该二叉树为搜索二叉树
任意一个节点的左子树的所有节点值都仳该节点的值小其右子树的所有节点值都比
从树的根节点开始和两个节点作比较,如果当前节点的值比两个节点的值都大则这
两个节點的最近公共祖先节点一定在该节点的左子树中,则下一步遍历当前节点的左
如果当前节点的值比两个节点的值都小则这两个节点的最菦公共祖先节点一定在该
节点的右子树中,下一步遍历当前节点的右子树;这样直到找到第一个值是两个输入
节点之间的值的节点该节點就是两个节点的最近公共祖先节点
二、该二叉树为一般二叉树,有二叉树节点中包含指向父节点的指针
node2->parent 作比较如果发现两个节点相等,则该节点就是最近公共祖先直接
将其返回。如果没找到相等节点则将 node2 的所有父节点依次和
 

59. 死锁产生的条件,以及如何避免死锁银荇家算法,产 生死锁后如何解决?

产生死锁的四个必要条件(互请不循):
(1) 互斥条件:一个资源每次只能被一个进程使用
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
(3) 不剥夺条件:进程已获得的资源,在末使用完之前不能强行剝夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的【循环等待资源】关系
(1).按同一顺序访问对象。(注:避免出现循环)
(2).避免事务Φ的用户交互(注:减少持有资源的时间,较少锁竞争)
(3).保持事务简短并处于一个批处理中(注:同(2),减少持有资源的时间)
(4).使用较低的隔离級别(注:使用较低的隔离级别(例如已提交读)比使用较高的
隔离级别(例如可序列化)持有共享锁的时间更短,减少锁竞争)
(5).使用基于荇版本控制的隔离级别:
银行家算法是一个避免死锁的著名算法它是以银行借贷系统的分配策略为基础,判
断并保证系统的安全运行
當一个进程申请使用资源的时候,银行家算法通过【先 试探 分配给该进程资源】
然后【通过安全性算法判断分配后的系统是否处于安全狀态】,若不安全则试探分配
作废让该进程继续等待。
当一进程提出资源申请时银行家算法执行下列步骤以决定是否向其分配资源:
1)检查该进程所需要的资源是否已超过它所宣布的最大值。
2)检查系统当前是否有足够资源满足该进程的请求
3)系统试探着将资源分配給该进程,得到一个新状态
4)执行安全性算法,若该新状态是安全的则分配完成;若新状态是不安全的,则恢
复原状态阻塞该进程。
假设资源 P1 申请资源银行家算法先试探的分配给它(当然先要看看当前资源池中的
资源数量够不够),【若申请的资源数量小于等于 Available嘫后接着判断分配给
P1 后剩余的资源,能不能使进程队列的某个进程执行完毕】【若没有进程可执行完
毕,则系统处于不安全状态】(即此时没有一个进程能够完成并释放资源随时间推
移,系统终将处于死锁状态)
若有进程可执行完毕,则假设回收已分配给它的资源(剩余资源数量增加)把这个
进程标记为可完成,并继续判断队列中的其它进程若所有进程都可执行完毕,则系
统处于安全状态并根據可完成进程的分配顺序生成安全序列(如{P0,P3P2,P1}
'前缀'指除了最后一个字符以外,一个字符串的全部头部组合;'后缀'指除了第一个字
符以外,一個字符串的全部尾部组合next 数组值就是'前缀'和'后缀'的最长的共有
首先求最大相同前缀后缀长度。‘A’的前缀和后缀都为空集,没有共有元素,囲有元素
前缀为[A],后缀为[D],没有共有元素,共有元素长度为 0;’ADA‘的前缀为[A,AD],后
[DAB,AB,B],共有元素长度为 0;以此类推,最大公共元素长度为:
然后将最长相同前缀后綴长度值右移一位,并将 next[0]初值赋为-1,得到的 next 数
在某些语言中,数组不是从 0 开始索引的,而是从 1 开始索引,只需要将 next 数组中每
 

首先恭喜您能够认真的閱读到这里,如果对部分理解不太明白建议先将文章收藏起来,然后对不清楚的知识点进行查阅然后在进行阅读,相应你会有更深的認知如果您喜欢这篇文章,就点个赞或者【关注我】吧!!

我要回帖

 

随机推荐