精华内容
下载资源
问答
  • 招银网络科技2016校招笔试题 招银网络科技2016校招笔试题 招银网络科技2016校招笔试题 招银网络科技2016校招笔试题
  • 七牛云2018校招笔试题七牛云2018校招笔试题七牛云2018校招笔试题
  • 中兴校招笔试题

    2020-05-25 23:00:53
    全新的中兴2015校招笔试题,希望对学弟学妹们有用,预祝大家找工作顺利
  • 校招笔试题

    2019-08-28 21:00:02
    不定期更新校招面试 一、前端(HTML、JS、CSS) 1、如何设置form表单中的只读属性 答:(1)readonly (2)disabled 2、如何解决一下代码在IE6下双倍边距的问题 答:(1)readonly (2)disabled 二、...


    之前秋春招做过的笔试题,不定期更新……

    一、前端(HTML、JS、CSS)

    • 1、如何设置form表单中的只读属性
      答:(1)readonly (2)disabled
    • 2、如何解决一下代码在IE6下双倍边距的问题
    <style>
    	div{
    		float:left;
    		margin-left:10px;
    		width:200px;
    		height:200px;
    		border:1px solid red;
    	}
    </style>
    

    答:添加属性display:inline;

    • 3、如何解决超链接被点击后hover样式不出现的问题?
      答:根据固定的顺序设置超链接的属性:link->visited->hover->active
    • 4、怎样定义1px左右高度的容器?
      答:overflow:hidden 或 zoom:0.08 或 line-height:1px,IE6下这个问题是因为默认的行高造成的
    • 5、编写代码,使得当鼠标划过文本框时,自动选中文本框的内容
      答:<input id=“txt” type=“txt” value=“yyfs” οnmοuseοver=“this.select()”>
    • 6、js中网页前进和后退的代码
      答:前进:history.forward(); history.go(); 后退:history.back(); history.go(-1);
    • 7、javascript能否定义二维数组,如果不能,如何解决?
      答:JavaScript不能定义二维数组,到哪可以用arr[0] = new Array();来解决
    • 8、CSS的正确注释是?
      A、// this is a comment //     B、// this is a comment
      C、/* this is a comment */    D、# this is a comment
      答:C
    • 9、请您写一段ajax提交的js代码或者写出ajax提交的过程逻辑
      答:
        var xmlHttp;
        if (window.XMLHttpRequest) {
            //IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
            xmlHttp = new XMLHttpRequest();
        }
        elseif(window.ActiveXObject)
        {
            //IE6, IE5 浏览器执行代码
            xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
        }
        xmlHttp.open('GET', '1.php?name=yyfs', true);
        xmlHttp.onreadystatechange = function () {
            if (xmlHttp.readyState == 4 && xmlhttp.status == 200) {
            	//判断ajax状态码 及 服务器返回状态码是否正常
                var text = xmlHttp.responseText;
            }
        }
        xmlHttp.send(null);
    
    • 10、如何产生带有数字列表符号的列表?
      A、<ul>     B、<dl>     C、<ol>     D、<list>
      答: C
    <ol>
      <li>咖啡</li>				//1.咖啡
      <li>牛奶</li>				//2.牛奶
      <li></li>				//3.茶
    </ol>
    
    <ol start="50">
      <li>咖啡</li>				//50.咖啡
      <li>牛奶</li>				//51.牛奶
      <li></li>				//52.茶
    </ol>
    
    • 11、以下JavaScript表达式哪些为真?
      A、NaN == NaN    B、null instanceof Object     C、null == undefined
      D、null === undefined E、false == 0    F、100 === 100    G、function(){} instanceof Object
      答: CEFG
    • 12、foo对象有att属性,一下哪些做法是可以获取att属性的值?
      A、foo[‘att’]    B、foo(‘att’)     C、foo{“att”}
      D、foo.att     E、foo[[“a”,“t”,“t”].join("")]
      答: ADE
    • 13、请说明HTML文档中DTD的意义和作用
      答:DTD,文档类型定义,是一种保证html文档格式正确的有效方法,在解析网页时,浏览器将使用DTD来检查页面的有效性,如是否符合规范,元素和标签是否正确,并采取相应的措施,同时还会影响浏览器的渲染模式。
    • 14、如何不使用submit按钮来提交表单
      答:利用JavaScript代码
    <!-- 第一种:直接通过a标签上嵌入JavaScript代码 -->
    <a href="javascript:document.myform.submit();">Submit Me</a>
    <script>
    	//第二种,利用js代码
    	document.getElementsByTagName("form")[0].submit()
    </script>
    
    • 15、请说明HTML文档中DTD的意义和作用
      答:DTD,文档类型定义,是一种保证html文档格式正确的有效方法,在解析网页时,浏览器将使用DTD来检查页面的有效性,如是否符合规范,元素和标签是否正确,并采取相应的措施,同时还会影响浏览器的渲染模式。
    • 16、Ajax技术利用了什么协议?简述Ajax的工作机制?
      答:HTTP协议,异步调用HTTP请求
    • 17、unicode和utf-8、utf-16、utf-32的区别?
      答:unicode是编码字符集,utf是字符集编码。字符的编码字符集是固定的,而字符存在计算机中的机器码取决于字符集编码。
        utf-8:用1-8个字节来保存unicode编码的字符
        utf-16:只能用两字节或四字节来保存字符
        utf-32:把所有的字符都用32bit,也就是4个字节来表示
        浅析unicode和UTF-8、UTF-16、UTF-32的区别
    • 18、cookies、sessionStorage、localStorage的区别?
      答:相同点:都存在客户端
        不同点:(1)存储大小:cookie数据小于4k,sessionStorage和localStorage虽然也有存储大小的限制,但比cookie大得多,可以达到5M
        (2)有效时间:localStorage:存储持久数据,浏览器关闭后数据不丢失,除非主机删除数据
                sessionStorage:数据在当前浏览器窗口关闭后删除
                cookie:设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭
        (3)数据与服务端之间的交互方式:cookie的数据会自动传递到服务端,服务端也可以写cookie到客户端,sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存
        (4)作用域:sessionStorage:不在不同的浏览器窗口中共享;localStorage和cookie:在所有的同源窗口中都共享
    • 19、同源策略,跨域的解决方案?
      答:同源指协议相同,域名相同,端口号相同,缺一不可,如http: //www.baidu.com与下面均不同源,http: //baidu.com(域名不同)和https: //www.baidu.com:8080(协议和端口号不同)
        跨域:(1)jsonp:ajax,只能get请求(2)CORS:服务器设置响应头Access-Control-Allow-Origin:*或Access-Control-Allow-Method等(3)window.name+iframe(4)代理:nginx转发

    二、后端(PHP及其他语言)

    • 1、isset()和empty的区别
      答:isset()检测变量是否被定义过,而empty()是检测变量是否为空,“”、“0”、0,empty()也认为为空,返回true
      empty(‘null’) //false    empty(array())      //true
      empty(null)  //true    empty(array(array()))   //false
    • 2、下面代码执行后的$result的值?
      $x = " "; $result = is_null($x); $result = empty($x); $result = isset($x);
      答:false,true,true
      解析:$x是一个空串,并不是null;nul没有分配空间,“ ”分配了空间
    • 3、输出代码结果
    $GLOBALS['var1'] = 5;
    $var2 = 1;
    function getValue(){
    	global $var2;
    	$var1 = 0;			//此时$var1是局部变量,应为$GLOBALS['var1'] = 0;
    	return $var2++;
    }
    getValue();
    echo $var1;				//5
    echo $var2;				//2
    
    • 4、使用五种方法以上获取一个文件的扩展名,如从dir/upload_image.jpg中获取jpg或.jpg
      答:
    /******  第一种  ******/
    function getExt1($filename){
    	return strrchr($filename, '.');
    }
    /******  第二种  ******/
    function getExt2($filename){
    	return substr($filename, strrpos($filename, '.'));
    }
    /******  第三种  ******/
    function getExt3($filename){
    	return array_pop(explode('.', $filename));
    }
    /******  第四种  ******/
    function getExt4($filename){
    	$ext = pathinfo($filename);
    	return $ext['extension'];
    }
    /******  第五种  ******/
    function getExt1($filename){
    	$revFilename = strrev($filename);
    	return strrev(substr($revFilename, 0, strpos($revFilename, '.');
    }
    
    • 5、写一个函数,尽可能高效的从一个标准的url里取出文件的扩展名,例如:http://www.sina.com.cn/abc/de/fg.php?id=1,需要取出php或.php
      答:
    function getExt1($url)
    {
        $arr = parse_url($url);
        $fileName = basename($arr['path']);
        $ext = explode('.', $fileName);
        return $ext[1];
    }
    
    function getExt2($url)
    {
        $url = basename($url);
        $pos1 = strpos($url, '.');
        $pos2 = strpos($url, '?');
        if ($pos2) {
            return substr($url, $pos1 + 1, $pos2 - $pos1 - 1);
        } else {
            return substr($url, $pos1 + 1);
        }
    }
    
    • 6、写一个函数,计算两个文件中的相对路径,如$a=’/a/b/c/d/e.php’;$b=’/a/b/12/34/c.php’;计算出$b相对于$a的相对路径应该是http://www.cnblogs.com/c/d/添上()
      答:
    <?php
    $src = '/a/b/c/d/e.php';
    $dst = '/a/b/12/34/c.php';
    echo getRelativePath($src, $dst);
    function getRelativePath($src, $dst)
    {
        $dstDir = explode('/', $dst);
        $dstFile = array_pop($dstDir);
        $srcDir = explode('/', dirname($src));
        $len = count($dstDir);
        //下标为0的元素为空
        for ($i = 1; $i < $len; ++$i) {
            if ($srcDir[$i] != $dstDir[$i]) {     //计算前面有多少段相同
                break;
            }
        }
        $returnPath = array_fill(0, $len - $i, '..');
        $returnPath = array_merge($returnPath, array_slice($dstDir, $i));
        return implode('/', $returnPath) . '/' . $dstFile;
    }//返回值../../12/34/c.php
    
    • 7、include和require都能把另一个文件包含到当前文件中,区别是什么,include_once和include的区别?
      答:区别是对包含文件的需求程度
      include是包含,如果被包含的文件不存在的话,则会提示一个错误,但程序会继续执行下去
      require是需要,如果被包含的文件不存在或者无法打开时,则会提示一个错误并终止程序运行
      once的意思是一次,则include_once和require_once表示只包含一次,避免重复包含
    • 8、如何设置你想要的错误敏感结果?
      答:在php.ini中设置,error_reporting = E_ALL :输出所有错误
        error_reporting = E_ALL&~E_NOTICE :输出致命的错误,不输出警告的错误
    • 9、如何设置你想要的错误敏感结果?
      答:在php.ini中设置,error_reporting = E_ALL :输出所有错误
        error_reporting = E_ALL&~E_NOTICE :输出致命的错误,不输出警告的错误
    • 10、下列哪种错误无法被自定义错误处理器捕捉到(双选)?
      A、E_WARNING     B、E_USER_ERROR     C、E_PARSE     D、E_NOTICE
      答:BC
    • 11、$x = true and false; var_dump($x); 输出结果为?
      答:true
      解析:“=”操作符的优先级比“and”操作符高,因此原语句可以转换为$x = true; true and false; 已经将true赋值给$x
    • 12、问$a的值是什么?
    $arr = [1=>1, 3=>3];$i=2;
    $a = 'test' . isset($arr[$i])? $arr[$i] : $i;
    

    A、test     B、NULL     C、2     D、test2
    答:B
    解析:“.”操作符的优先级比“?:”操作符高,因此原语句可以转换为(‘test’ . isset($arr[$i]))? $arr[$i] : $i;

    • 13、问下面输出的值是什么?
    $a = 3;$b = 5;
    if($a = 5 || $b = 7){
    	$a++;$b++;
    }
    echo $a.' '.$b;
    

    答:1 6
    解析:“=”操作符的优先级比“||”操作符低,所以先判断逻辑再赋值,逻辑语句可以改为$a = ( 5 || $b = 7),此时5直接判断为true,$a = true,true++为1,$b = 5. ++= 6

    • 14、问下面输出的值是什么?
    $x = 2;echo $x == 2?'我'$x == 1? '你' : '它';
    

    答:你
    解析:“==”操作符的优先级比“?:”操作符高,原语句可以改为(($x == 2)?‘我’ :($x == 1))? ‘你’ : ‘它’;
    echo $x == 2 ? '我 ’ : $x==1?‘你’: '它 '; // 加粗条件为真,输出我,为真,则输出前者:你
    echo $x == 1 ? '我 ’ : $x==1 ?‘你’: '它 '; //加粗条件为假,输出$x==1,为假,输出后者:它

    • 15、在网站上如果要上传超大的文件,那么需要对php.ini做哪些更改?
      答:upload_max_filesize:服务器允许上传文件的最大值
        max_execution_time:PHP中一个指令所能执行的最大时间,单位是秒
        memory_limit:PHP中一个指令所分配的内存空间,单位是M
        文件上传的相关系统配置
    • 16、对于流量比较大的网站,应采取什么样的措施来缓解访问量问题?
      答:确认系统硬件是否足够支持当前的数据流量,数据库要做读写分离,优化数据表,为常用的数据表添加索引。程序功能限制,禁止外部用户盗链图片或信息等,限制大文件的下载,使用不同主机分流主要流量。
    • 17、$v = 1; $m = 2; $l = 3; if( $l>$m>$v) echo ‘yes’; else echo ‘no’; 输出结果为?
      答:“no“
      解析:$l>$m会转换成1,而1 == $v,则输出结果为“no“
    • 18、如何高效地计算出当前脚本执行所花费的时间?
      答:$_SERVER[‘REQUEST_TIME’]
    • 19、写出程序的输出结果?$test = ‘aaa’; $abc = &$test; unset($test); echo $abc;
      答:aaa
      解析:只删除了test变量名,abc变量指向的内容还存在
    • 20、解决多线程同时写一个文件的问题?
      答:flock($handle, LOCK_EX);
    • 22、下面不是PHP语法的组成部分函数的是?
      A、array     B、eval     C、each     D、list
      答:C
      解析:array是数据结构,不是常规函数;eval将字符串按照PHP代码计算,list是把数组中的值赋给一些变量。each返回数组中当前的键值对,并将数组指针向前移动一步
    • 23、执行代码的结果,echo function_exists(‘print’)?
      答:空
      解析:function_exists:检查函数是否存在,存在则返回true,否则返回false。对于语法结构的判断,例如include和echo这类性质的语法将会返回false
    • 24、输出代码的执行结果?
      $bool = true; echo gettype($bool); echo is_string($bool);
      A、boolean     B、boolean0     C、booleanFALSE     D、booleanfalse
      答:A
      解析:gettype获取数据类型,is_string是字符串则返回true,反之返回false。false打印(直接echo)为空。
    • 25、写出程序的运行结果?
      $a = $b = 0;
      (1)if($a = 3 || $b = 3) { $a++; $b++;}
      (2)if($a = 3 | $b = 3) { $a++; $b++;}
      echo $a . ‘。’ . $b;
      答:(1)1。1(2)4。4
      解析:(1)∵$a = 3 || $b = 3中,$a和$b均为布尔值,为true,true自增无效
         (1)∵或操作,则$a = $b = 3,自增为4。4
    • 26、_____函数能返回脚本里的任意行中调用的函数名称,该函数同时还经常被用在调试中,用来判断错误是如何发生的?
      答:debug_backtrace():返回一个二维关联数组
    • 27、OO面向对象: Object Oriented :OOA :Analysis面向对象分析,OOD:Design面向对象设计,OOP:Programing面向对象编程
    • 28、$fruits = [‘banana’ => ‘yellow’],不能正确得到结果‘yellow’的代码是?
      A、echo “A banana is {$fruits[‘banana’]}”;
      B、echo “A banana is $fruits[‘banana’]”;
      C、echo “A banana is {$fruits[banana]}”;
      D、echo “A banana is $fruits[banana]”;
      答:B
      解析:∵那样写相当于把banana拆出来,会报错
    • 29、问 $data 的值是什么?
    <?php
    $data = ['a', 'b', 'c'];
    foreach ($data as $key => $val){
    	$val = &$data[$key];
    }
    

    答:bcc
    解析:$data[0] = ‘a’; $v = &$data[0] = ‘a’
       $data[1] = ‘b’; $v = &$data[1] = ‘b’
       此时,$v = ‘b’,因为引用传值,则影响$data[0] = ‘b’。且$v = &$data[1],引用改变为引用$data[1],后期不会再影响$data[0],后面类似。程序流程为 abc —> bbc —> bcc

    • 30、下面的运行结果是?
    $date = mktime(9, 12, 31, 6, 10, 2015);
    echo "创建时间是" . date("Y-m-d H:i:s", $date);
    

    答:创建时间是2015-06-10 09:12:31
    解析:mktime(hour, minute, seconds, month, day, year)

    • 31、在PHP中如何获取客户端和服务端的IP地址?
      答:getenv(‘REMOVE_ADDR’);      // 获取客户端IP地址
        getenv(‘SERVER_ADDR’);      // 获取服务端IP地址
        gethostbyname(‘www.sina.com’);  // 获取指定域名的IP地址
    • 32、详细说明session和cookie,并指出二者的区别和适用方向?
      答:cookie通过在客户端记录信息确认用户身份,session通过在服务端记录信息确认用户身份
      区别: 1、cookie数据存放在客户的浏览器上,session数据放在服务器上
      2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session
      3、session会在一定时间内存放在服务器,当访问增多,会比较占用服务器的性能,考虑到减轻服务器压力的方面,应当使用cookie
      4、单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie
      5、建议:将登陆信息存放为SESSION,将其他信息存放在COOKIE中
    • 33、PHPsession扩展默认将session数据存储在哪里?
      A、SQLite Database  B、MySQL Database  C、shared Memory  D、File System  E、session Server
      答:D
    • 34、实现中文字符串截取无乱码的方法,下列代码输出结果是
    $str = 'fal天涯海角';
    echo mb_substr($str,0,5,'utf8');
    echo mb_substr($str,0,5,'gbk');
    

    答:fal天涯 fal天
    解析:utf8下一个中文字符占3个字节,gbk下一个中文字符占2个字节

    • 35、不适用第三个变量交换两个变量的值
      答:
    <?php
    /******** (1) 允许使用内置函数 ********/
    $a = 111;
    $b = 222;
    list($a, $b) = [$b, $a];
    /******** (2) 不允许使用内置函数 ********/
    $a = "This is A";
    $b = "This is B";
    echo "交换之前a的值:{$a},b的值:{$b}";
    //交换之前a的值:This is A,b的值:This is B
    $a = $a ^ $b;
    $b = $b ^ $a;
    $a = $a ^ $b;
    echo "交换后a的值:{$a},b的值:{$b}";
    //交换后a的值:This is B,b的值:This is A
    
    • 36、数据库关闭指令将关闭哪个链接标识?
    $link1 = mysql_connect("localhost", "root", "");
    $link2 = mysql_connect("localhost", "root", "");
    mysql_close();
    

    A、link1     B、link2     C、全部关闭     D、报错
    答:B
    解析:如果没有指定link,则默认关闭上一个打开的链接

    • 37、关于mysql_pconnect说法正确的是?
      A、与数据库进行多连接
      B、与mysql_connect功能相同
      C、与@mysql_connect功能相同
      D、与数据库建立持久连接
      答:D
      解析:mysql_close将不会关闭该链接
    • 37、$a的值是?
      A、true     B、1     C、false     D、null
      答:C
      解析:未定义的变量就是false
    • 38、以下说法错误的是?
      A、在外部访问静态成员属性时使用类名::静态成员属性名
      B、在外部访问静态成员属性时使用实例化对象->静态成员属性名
      C、在外部访问静态方法时使用实例化对象->静态方法名
      D、在外部访问静态方法时使用类名::静态方法名
      答:B
      解析:静态属性不能通过一个类已实例化的对象来访问,但静态方法可以
    • 39、在PHP面向对象中,下面关于final修饰符描述错误的是()?
      A、使用final标识的类不能被继承
      B、在类中使用final标识的成员方法,在子类中不能被覆盖
      C、不能使用final标识成员属性
      D、使用final标识的成员属性,不能在子类中再次被定义
      答:D
      解析:属性不能定义为final,只有类和方法可以
    • 40、阅读下面PHP代码,并选择输出结果
    class A{public $num = 100;}
    $a = new A();
    $b = $a;
    $a->num = 200;
    echo $b->num;
    

    A、100     B、200     C、没有输出     D、程序报错!
    答:B
    解析:一个对象变量已经不再是保存整个对象,而只是保存一个标识符来访问真正的对象内容。另外一个变量$b与$a指向同一个对象的真正内容。∴$a->num改变,$b->num也应该改变

    • 41、PDO::ATTR_ERRMODE设置为以下哪个值时,PDO会抛出PDOException?
      A、PDO::ERRMODE_SILENT     B、PDO::ERRMODE_WARNING     C、PDO::ERRMODE_EXCEPTION     D、PDO::errorInfo
      答:C
      解析:PDO::ATTR_ERRMODE:错误提示、PDO::ERRMODE_SILENT:不显示错误信息,只显示错误码
      PDO::ERRMODE_WARNING:显示警告错误、PDO::ERRMODE_EXCEPTION:抛出异常
    • 42、哪个函数可以控制PHP的错误信息是否输出到页面上?
      A、error_reporting     B、error_log     C、error_trigger     D、error_echo
      答:A
      解析:B:error_log发送错误信息到某个地方记录日志
      C:写错,只有trigger_error()产生一个用户级别的error/warning/notice信息
      D:没有这个函数
    • 43、array(‘a’) + array(‘b’) 的结果是?
      A、array(‘a’,‘b’)     B、array(‘b’,‘a’)     C、array(‘a’)     D、array(‘b’)
      答:C
      解析:键值相同,前者不能被后者覆盖
    • 44、下面属于函数,而非语法结构的是?
      A、is_set  B、is_null  C、print_r  D、print  E、echo  F、list  G、empty
      答:ABCG
      解析:PHP的语言结构:echo() print() die() isset() unset() include() array() list() empty() require(),注意,include_once()是函数 ,require_once()是函数
    • 45、用最少的代码写一个3值最值函数?
      答:
    function maximum($a, $b, $c)
    {
        return $a > $b ? ($a > $c ? $a : $c) : ($b > $c ? $b : $c);
    }
    echo maximum(24, 15, 8);
    
    • 46、$a = in_array(‘01’, [‘1’]) == var_dump(‘01’ == 1);$a的值为?
      答: true,in_array(‘01’, array(‘1’))返回true,var_dump(‘01’==1)也返回true.因此$a值为true。
      in_array需要配合第三个参数,才会对数据进行全等===匹配,否则还是==匹配
    • 47、<?php echo -10%3;?>
      答:-1
      解析:-的优先级比%低,所以是-(10%3)
    • 48、file1 :<?php $a='123';?>   file2 :<?php echo include('file.php');?>
      答:1
      解析:echo 的是include的返回值,但如果被包含的文件有return,则返回该return的值
    • 49、下列PHP配置项中,哪一个和安全最不相关?
      A、open_basedir     B、register_globals     C、disable_functions     D、file_uploads
      答:D
      解析:register_globals:注册为全局变量,默认为off。
      disable_functions:限制程序使用一些直接执行系统命令的函数
      open_basedir:限制用户访问文件目录,但只是目录前缀
    • 50、开启php.ini文件中的safe_mode选项,会影响到哪些函数的应用?至少说出四个
      答:pathinfo、basename、fopen和exec等函数
    • 51、<?php echo intval((0.1+0.7) * 10);?>
      答:7
      解析:0.1+0.7=0.8是浮点数,*10在数学计算中是正整数,在计算机中仍是浮点数8,实际值是7.9999…
    • 52、指出<?php echo 'Testing' . 1 + 2 . '45';?>的输出结果
      A、Testing1245     B、Testing345     C、Testing1+245     D、245
      答:D
      解析:(‘Testing’ . 1) + (2 . ‘45’) = 数值转换 = > 0 + 245 = > 245
    • 53、$x = null;if(‘0xFF’ == 255) $x = (int)‘0xFF’; echo $x; 结果是什么?
      答:$x = 0而不是255
      解析:将一个字符串进行强制类型转换会从左向右进行转换,‘0xFF‘转换到 ‘x‘ 时停止转换,所以$x = 0
    • 54、下列语句中,希望输出的结果是什么?
      $a = 3;echo “\\\$a”;echo “${a}”;

      答:\$a 3
      解析:转义特殊字符

    三、数据库

    • 1、在MySQL中,concat函数中的作用是将传入的参数连接成为一个字符串,则concat(‘aaa’, null, ‘bbb’)的结果是( )
      A、aaabbb     B、aaa     C、bbb     D、NULL
      答:D
    • 2、如何实现MySQL数据库的双机热备份(描述出原理即可)?
      答:双机热备份通过日志文件来传输服务器上数据的变化。主服务器进程在数据被更新时触发,并将相应的日志文件发送到从服务器,从服务器进程接收到主服务器发送的日志文件后,阅读日志文件并对响应的数据库进行操作。
    • 3、mysql中varchar的最大长度是多少,用什么类型的字段存储大文本?
      答:65535,text
    • 4、date、datetime和timestamp有什么区别?
      答:
      (1)date:只保留日期,不保留时分秒
      (2)datetime:保留日期和时分秒,mysql检索且以“YYYY-MM-DD HH:MM:SS”格式显示datetime值,支持的范围是1000-01-01 00:00:00 到9999-12-31 23:59:59
      (3)timestamp:格式与datetime相同,但其取值范围小于datetime,使用timestamp可以自动地用当前的日期和时间标记insert和update操作,如果有多个timestamp列,只有第一个自动更新。
    • 5、怎么看数据库中有哪些sql正在进行?
      答:show processlist;

    四、网络

    • 1、要判断IP地址是否在同一网络,下列哪一项运算正确( )
      A、IP非子网掩码   B、IP或子网掩码    C、IP与子网掩码    D、IP模2加子网掩码
      答:C
    • 2、请写出下列服务的用途和默认端口?
      答:(1)FTP:专门用来传输文件的协议,默认端口21
        (2)SSH:为建立在应用层和传输层基础上的安全协议,SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中信息泄露的问题。默认端口22
        (3)HTTP:超文本传输协议是互联网上应为最为广泛的一种网络协议,所有的www文件都必须遵守这个标准,设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。默认端口80
        (4)Telnet:是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用的电脑上使用telnet程序,用它连接到服务器上运行,就像直接在服务器的控制台上输入一样,可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。默认端口23
        (5)HTTPS:是以安全为目标的HTTP通道,即在HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的内容就需要SSL。默认端口443
    • 3、HTTP/1.0中,状态码200,301,304,403,404,500的含义?
      答:200:服务器成功返回网页            301:请求的网页已永久移到新位置
        304:自从上次请求后,请求的网页未修改过    403:服务器拒绝请求
        404:请求的网页不存在             503:服务器超时
    • 4、简述POST和GET传输的最大容量分别是?
      答:GET方法传递数据,控制在1MB之内,POST方法传输数据没有大小限制
    • 5、什么是CGI?什么是FastCGI?php-fpm,FashCGI,Nginx之间是什么关系?
      解析:CGI,通用网关接口,用于WEB服务器和应用程序间的交互,定义输出规范,用户的请求通过 WEB服务器转发给FastCGI进程。
      FastCGI进程再调用应用程序进行处理,如php解析器,应用程序的处理结果如html返回给FastCGI,FastCGI返回给Nginx进行输出。
      假设WEB服务器是Nginx,应用程序是PHP,而php-fpm是管理FastCGI的,这就是php-fpm,FashCGI,Nginx之间的关系。
      FastCGI用来提高cgi程序性能,启动一个master,再启动多个worker,不需要每次解析php.ini,而php-fpm实现了FastCGI协议,是FastCGI的进程管理器,支持平滑重启,可以启动的时候预先生成几个进程。
    • 6、什么是CSRF攻击?XSS攻击?如何防范?
      答:
      (1)CSRF:跨站请求伪造,攻击方伪装用户身份发送请求从而窃取信息或破坏系统。基本原理:用户访问A网站登录并生成Cookie,再访问B网站,如果A网站存在CSRF漏洞,此时B网站给A网站的请求,A网站会认为是用户发的请求,从而B网站成功的伪装了身份,因此叫做跨站请求伪造
      防范:1、合理规范api请求方式,GET,POST
          2、对POST请求加token令牌校验,生成一个随机码并存入session,表单中带上这个随机码,提交的时候服务端进行验证随机码是否相同
      (2)XSS:跨站脚本攻击
      防范:不相信任何输入,过滤输入
    • 7、?
      答:
    • 8、?
      答:
    • 9、?
      答:

    五、Linux

    • 1、请解释下列10个shell命令的用途
      答:top:该命令提供了实时对系统处理器状态的监控,它能够实时显示系统中各个进程的资源占用情况。该命令按照对CPU,内存使用和执行时间对系统任务进程进行排序显示,同时还可以通过交互式命令进行设定显示
        ps:显示系统进程在瞬间的运行状态
        mv:文件/目录改名或变更存储位置
        find:在指定的路径下查找指定文件
        df:检查磁盘空间占用情况
        cat:将文件的内容打印到标准输出
        chmod:改变文件的权限
        chgrp:改变文件所属组
        grep:过滤文本,根据指定的字符串,对文件的每一行进行搜索,若找到,则输出该内容
        wc:统计指定文件中的字节数,字数,行数,并将统计结果输出显示
    • 2、?
      答:
    • 3、?
      答:
    • 4、?
      答:
    • 5、?

    六、算法

    • 1、有一组数28, 32, 43, 14, 53, 67, 42, 54, 46, 31,写程序排列这组数(要求:第一个最大,第二个最小,第三个是剩下中最大声的,第四个是剩下中最小的,以此类推)?
    <?php
    $a = $b = [28, 32, 43, 14, 53, 67, 42, 54, 46, 31];
    rsort($a);  //对数组进行降序排序
    sort($b);   //对数组进行升序排序
    $count = count($a);
    $result = [];
    for ($i = 0; $i <= ($count / 2 - 1); $i++) {
        $result[$i * 2] = $a[$i];     //把最大的放第一位
        $result[$i * 2 + 1] = $b[$i];   //把最小的放第二位
    }
    var_dump($result);
    
    • 2、一群猴子排成一圈,按1,2,……n依次排号,然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,再把它踢出去……,如此不停的进行下去,知道最后剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m,n,输出最后大王的编号
    • 3、假设有"123<em>abc</em>456<em>def</em>789"这么一个字符串,写一个函数,可以传入一个字符串,和一个要截取的长度。返回截取后的结果。
      要求:
      (1)<em>和</em>标记不得计算在长度之内。
      (2)截取后的字符串,要保留原有<em>标签,不过如果最后有一个标签没有闭合,则去掉其开始标签。
      示例:题中的字符串,要截取长度5,则返回的字符串应该为123ab,要截取长度8,应返回123abc45。

      答:
    <?php
    $str = "123<em>abc</em>456<em>def</em>789";
    $len = 8;
    echo cut($str,$len);              //123<em>abc</em>45
    
    $len = 5;
    echo cut($str,$len);              //123ab
    function cut($str, $len)
    {
        $offset = $resLen = 0;
        $result = '';
        $strLen = strlen($str);
        do {
            //$match的内容,[0] => 全匹配的内容 [1] => 括号内匹配的内容
            //array(2) { [0]=> array(2) { [0]=> string(12) "<em>abc</em>" [1]=> int(3) } [1]=> array(2) { [0]=> string(3) "abc" [1]=> int(7) } } 
            $num = preg_match("/<em>(.*?)<\/em>/i", $str, $match, PREG_OFFSET_CAPTURE, $offset);
            if ($num) {   //返回1,则是找到了匹配值
                //要裁剪的值,先裁剪匹配到的字符串,判断是否已经满足条件
                $subLen = ($len - $resLen > $match[0][1] - $offset) ? $match[0][1] - $offset : $len - $resLen;
                $result .= substr($str, $offset, $subLen);
                $offset += $subLen + strlen($match[0][0]);      //加上这整一串匹配的偏移量
                $resLen += $subLen;     //结果长度增加
                if ($resLen < $len) {   //判断是否需要裁剪括号内匹配的内容
                    if ($len - $resLen >= strlen($match[1][0])) {       //如果括号内的接上还是不满足裁剪长度,则把括号内的全接上
                        $result .= $match[0][0];
                        $resLen += strlen($match[1][0]);                //加上括号内匹配的长度
                    } else {
                        $result .= substr($match[1][0], 0, $len - $resLen);
                        break;
                    }
                }
            } else {
                $result .= substr($str, $offset, $len - $resLen);      
                break;
            }
        } while ($offset < $strLen && $resLen < $len);                      //判断是否满足条件,裁剪的长度已经到达字符串长度,结果长度已经到达要求的长度
        return $result;
    }
    
    • 4、每瓶啤酒2元,2个空酒瓶或4个瓶盖可换1瓶啤酒。10元最多可喝多少瓶啤酒?
    <?php
    /**
     * @param $bottle
     * @param $top
     * @return float|int
     */
    function beer($bottle, $top)
    {
        if ($bottle >= 2 || $top >= 4) {    //判断是否可以进行兑换
            $bottleToBeer = floor($bottle / 2); //酒瓶可以兑换的酒
            $topToBeer = floor($top / 4);       //瓶盖可以兑换的酒
            $remainBottle = $bottleToBeer + $topToBeer + $bottle % 2;   //剩余的酒瓶
            $remainTop = $bottleToBeer + $topToBeer + $top % 4;         //剩余的瓶盖
            $topToBeer = $bottleToBeer + $topToBeer + beer($remainBottle, $remainTop);      //此次兑换的酒+后续兑换的酒进行递归
            return $topToBeer;
        }
        return 0;   //直至无法兑换
    }
    
    $money = 10;
    $beer = floor($money / 2);          //10元第一次可以买多少酒
    $totalBeer = $beer + beer($beer, $beer);  //第一次买的 + 兑换的
    echo $totalBeer;        //15
    
    • **5、计算如下几个字母代表的数字:
      AB - CD = EF
      EF + GH = PPP **
      解析:两位数相加最多是100+,因此P可确定为1,EF + GH = 111
      ABCDEFGH代表数字不能重复
    <?php
    for ($e = 0; $e < 10; $e++) {
        if ($e == 1) {    //过滤
            continue;
        }
        for ($f = 0; $f < 10; $f++) {
            if ($f == 1 || $f == $e) { //过滤
                continue;
            }
            for ($g = 0; $g < 10; $g++) {
                if ($g == 1 || $g == $e || $g == $f) { //过滤
                    continue;
                }
                for ($h = 0; $h < 10; $h++) {
                    if ($h == 1 || $h == $e || $h == $f || $h == $g) { //过滤
                        continue;
                    }
                    $sum = ($e + $g) * 10 + $h + $f;
                    if ($sum == 111) {    //结果确定的时候
                        for ($a = 0; $a < 10; $a++) {
                            if (in_array($a, [1, $e, $f, $g, $h])) {
                                continue;
                            }
                            for ($b = 0; $b < 10; $b++) {
                                if (in_array($b, [1, $a, $e, $f, $g, $h])) {
                                    continue;
                                }
                                for ($c = 0; $c < 10; $c++) {
                                    if (in_array($c, [1, $b, $a, $e, $f, $g, $h])) {
                                        continue;
                                    }
                                    for ($d = 0; $d < 10; $d++) {
                                        if (in_array($d, [1, $c, $b, $a, $e, $f, $g, $h])) {
                                            continue;
                                        }
                                        if ((($a - $c - $e) * 10 + $b - $d - $f) == 0) {
                                            printf("{$a}{$b} - {$c}{$d} = {$e}{$f}  {$e}{$f} + {$g}{$h} = 111<br>");
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    
    • 6、
    • 7、
    展开全文
  • 2018名企校招笔试真题精选技术篇.pdf 2018名企校招笔试真题精选技术篇.pdf 2018名企校招笔试真题精选技术篇.pdf 2018名企校招笔试真题精选技术篇.pdf
  • 海康威视2016校招笔试题
  • 剑指Offer——京东校招笔试题+知识点总结笔试感言 经过一系列的笔试,发觉自己的基础知识还是比较薄弱的,尤其是数据结构和网络,还有操作系统。工作量还是很大的。做到精确制导的好方法就是在网上刷题,包括牛客和...

    剑指Offer——京东校招笔试题+知识点总结

    笔试感言

        经过一系列的笔试,发觉自己的基础知识还是比较薄弱的,尤其是数据结构和网络,还有操作系统。工作量还是很大的。做到精确制导的好方法就是在网上刷题,包括牛客和赛马网。另外,赛马网的编程IDE实在是不敢恭维。在本地运行正确,在他那居然提示全部数据未通过。

       关键是在京东投的是Android岗,我只能说总体上Android确实比Java岗容易,但是自己的重心还是放在Java后台研发的。

       网络方面,其中考到FTP端口。TCP、HTTP等。

       默认情况下FTP协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息。但是,是否使用20作为传输数据的端口与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20;如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定。

       默认HTTP的端口号为80,HTTPS的端口号为443;

         TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。

         TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。

         UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。

         UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。

         UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网络时间协议)和DNS(DNS也使用TCP)。

         SMTP:简单邮件传输协议,使用TCP连接,端口号为25;

         SNMP:简单网络管理协议,使用UDP 161端口;

       对于一个已经建立的连接,TCP使用改进的三次握手来建立连接(使用一个带有FIN附加标记的报文段),使用四次挥手释放连接;

         cookie是存储在客户端 session是存储在服务端;

     

         DNS协议运行在UDP协议之上,使用端口号53;

        UDP报头只有四个域:源端口号,目的端口号,数据报长度,检验和。

        UDP是无连接,无超时重发,大数据传输容易造成数据重复或者数据中断等,无法保证数据包不损坏.

        UDP是无连接的用户数据报协议,传输过程无阻塞不重发,只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地,所以没有可靠性.

        UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快

        TCP协议才是窗口机制的三次握手连接会话.

      数据结构方面设计到二叉排序树(二叉查找树)字典树(Trie树)、散列表(Hash表)等知识点。

    简答题

    1.jvm垃圾收集基本原理

      主要从三个方面(Which、When、How)进行解答:1.哪些内存需要回收?2.什么时候回收?3.如何回收?

      确定哪些内存需要回收,主要采用引用计数法和可达性分析方法。

    引用计数(Reference Counting) 

       比较古老的回收算法。原理是给对象添加一个引用计数器,此对象有一个引用,计数器值加1;引用失效时,计数器值减1。垃圾回收时,只用收集计数为0的对象。此算法最致命的缺点是无法处理循环引用的问题。

    可达性分析方法(Reachability Analysis)

       基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为“引用链(Reference Chain)”,当一个对象到GC Roots没有任何引用链时(用图论的话说,就是GC Roots到这个对象不可达),则证明该对象是不可用的。

    垃圾收集算法

        回收算法主要采用标记-清除算法、复制算法(新生代)、标记整理算法(老年代)、分代收集算法。

    标记-清除(Mark-Sweep)

      此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。 故存在效率、空间浪费问题。

    复制(Copying)

      此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。此算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要内存空间缩小为原来的一半。 现在的商业虚拟机都采用这种收集算法来回收新生代

    标记-整理(Mark-Compact)

       此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把所有存活对象“压缩”到堆的其中一块,按顺序排放,然后直接清理掉边界之外的内存。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。 主要用来回收老年代

    增量收集(Incremental Collecting)

       实时垃圾回收算法,即:在应用进行的同时进行垃圾回收。不知道什么原因JDK5.0中的收集器没有使用这种算法。

    分代(Generational Collection)

       基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青代、年老代、持久代,对不同生命周期的对象使用不同的算法(上述方式中的一个)进行回收。现在的垃圾回收器(从J2SE1.2开始)都是使用此算法的。

    2.单例模式

        写出单例模式的2种方式(其实就是懒汉式与饿汉式啊,自己居然想成了加锁的不同形式,太菜了~);

     

    单例模式的两种实现方式

     

     

    package cn.edu.ujn.practice;
    // 懒汉式
    public class Singleton {
    private static Singleton singleton;
    private Singleton(){}
    public static Singleton getInstance(){
    if(singleton == null){
    synchronized(Singleton.class){
    if(singleton == null){
    singleton = new Singleton();
    }
    }
    }
    return singleton;
    }
    }
    // 饿汉式
    class SingletonHungry{
    private final static SingletonHungry singletonHungry = new SingletonHungry();
    private SingletonHungry(){}
    // 务必使用static声明为类所属方法
    public static SingletonHungry getInstance(){
    return singletonHungry;
    }
    }

    编程题

        Android岗中2道编程题如下:

     

    美文美图

     

    展开全文
  • 剑指Offer——美团内推+校招笔试题+知识点总结前言 美团9.9内推笔试、9.11校招笔试,反正就是各种虐,笔试内容如下: 知识点:图的遍历(DFS、BFS)、进程间通信、二叉查找树节点的删除及中序遍历、HTTP会话的4个过程、...

    剑指Offer——美团内推+校招笔试题+知识点总结

    前言

        美团9.9内推笔试、9.11校招笔试,反正就是各种虐,笔试内容如下:

        知识点:图的遍历(DFS、BFS)、进程间通信、二叉查找树节点的删除及中序遍历、HTTP会话的4个过程、红黑树、1024!有多少个0,60块糖分给5个人,如何分等。编程题考察拿红包、多叉树(见下图)。

         

     

          另外,更变态的是其IDE编程居然在多行输入问题上死翘翘了,基本上就是纠结于到底如何实现多行输入,结果就挂了!整理后的多行输入如下:

     

    package cn.edu.ujn.practice;
    import java.util.Scanner;
    import java.util.regex.Pattern;
    import java.util.ArrayList;
    // 死在了多行输入上
    public class meituan1 {
    static ArrayList<Integer> list = new ArrayList<Integer>();
    public static void main(String [] args){
    Scanner in = new Scanner(System.in);
    int lines = in.nextInt();
    Pattern pattern = Pattern.compile("[,]+");
    int [] arr = null;
    // 用于接收换行符
    in.nextLine();
    for(int i = 0; i < lines; i++){
    String [] str = pattern.split(in.nextLine());
    arr = new int[str.length];
    for(int j = 0; j < str.length; j++){
    //System.out.print(str[j]+" ");
    arr[j] = Integer.parseInt(str[j]);
    }
    // 调用方法
    solution(arr);
    //System.out.println();
    }
    for(int k = 0; k < arr.length; k++){
    //System.out.println(arr[k]);
    }
    for(Integer a : list){
    System.out.print(a + "");
    }
    }
    private static void solution(int [] arr){
    System.out.println(arr.length);
    list.add(1);
    }
    }

     

        测试结果如下:

    注 红黑树基本性质

     

      性质1. 节点是红色或黑色。

        性质2. 根是黑色。

        性质3. 所有叶子都是黑色(叶子是NIL节点)。

        性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

        性质5. 从任一节点到其每个叶子的所有简单路径 都包含相同数目的黑色节点。

     

    注 质数 素数 合数

     

        质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。换句话说,只有两个正因数(1和自己)的自然数即为素数。比1大但不是素数的数称为合数。1和0既非素数也非合数。合数是由若干个质数相乘而得到的。所以,质数是合数的基础,没有质数就没有合数。这也说明了前面所提到的质数在数论中有着重要地位。历史上曾将1也包含在质数之内,但后来为了算术基本定理,最终1被数学家排除在质数之外,而从高等代数的角度来看,1是乘法单位元,也不能算在质数之内,并且,所有的合数都可由若干个质数相乘而得到。

     

    注 1024!末尾有多少个0?  

     

      1024的阶乘末尾有多少个0,这个问题只要理清思想就很好解了。  

      有多少个0取决于有多少个10相乘,即1024拆成小单元后有多少个10。

      由于10不是素数,所以直接用10进行计算的话会有很多问题,于是将10分解。 10可以分解成2*5,2和5都是素数,由于每2个相邻的数中一定包含2,所以只要计算出有多少个5就可以了(2会在5之后及时出现)。

      于是解法如下:  

      是5的倍数的数有: 1024 / 5 = 204个

      是25的倍数的数有:1024 / 25 = 40个

      是125的倍数的数有:1024 / 125 = 8个

      是625的倍数的数有:1024 / 625 = 1个  

      所以1024! 中总共有204+40+8+1=253个因子5。

      即1024!后有253个0。

    编程实现

     

    package cn.edu.ujn.demo;
    
    public class Prime {
    
    	public static void main(String[] args) {
    		int num = 1024;
    		System.out.println(sumOfZero(num));
    	}
    	
    	// 结算阶乘中包含0的个数
    	private static int sumOfZero(int num){
    		int cnt = 0;
    		int a = 5;
    		while(num > 0){
    			cnt += num / a;
    			num /= a;
    		}
    		return cnt;
    	}
    }

    注 进程间通信机制

          进程的通信机制主要有:管道、有名管道、消息队列、信号量、共享空间、信号、套接字。

    管道

         它传递数据是单向性的,只能从一方流向另一方,也就是一种半双工的通信方式;只用于有亲缘关系的进程间的通信,亲缘关系也就是父子进程或兄弟进程;没有名字并且大小受限,传输的是无格式的流,所以两进程通信时必须约定好数据通信的格式。管道它就像一个特殊的文件,但这个文件之存在于内存中,在创建管道时,系统为管道分配了一个页面作为数据缓冲区,进程对这个数据缓冲区进行读写,以此来完成通信。其中一个进程只能读一个只能写,所以叫半双工通信,为什么一个只能读一个只能写呢?因为写进程是在缓冲区的末尾写入,读进程是在缓冲区的头部读取,他们各自的数据结构不同,所以功能不同。

    有名管道

       看见这个名字就能知道个大概了,它与管道不同之处是它有名字。这就不同于管道只能在具有亲缘关系的进程间通信了。它提供了一个路径名与之关联,有了自己的传输格式。有名管道和管道的不同之处还有一点是,有名管道是个设备文件,存储在文件系统中,没有亲缘关系的进程也可以访问,但是它要按照先进先出的原则读取数据。同样也是单双工的。

    消息队列

         是存放在内核中的消息链表,每个消息队列由消息队列标识符标识,与管道不同的是,消息队列存放在内核中,只有在内核重启时才能删除一个消息队列,内核重启也就是系统重启,同样消息队列的大小也是受限制的。

    信号量

         也可以说是一个计数器,常用来处理进程或线程同步的问题,特别是对临界资源的访问同步问题。临界资源:为某一时刻只能由一个进程或线程操作的资源,当信号量的值大于或等于0时,表示可以供并发进程访问的临界资源数,当小于0时,表示正在等待使用临界资源的进程数。更重要的是,信号量的值仅能由PV操作来改变。

    共享内存

         就是分配一块能被其他进程访问的内存。共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。首先说下在使用共享内存区前,必须通过系统函数将其附加到进程的地址空间或说为映射到进程空间。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到 进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而 共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就 解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存 中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。

    信号

         信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源。信号分为可靠信号和不可靠信号,实时信号和非实时信号。进程有三种方式响应信号1.忽略信号2.捕捉信号3.执行缺省操作。

    套接字

         这一块在网络编程那一块讲的 很多,在此就不在说拉。

    注 next()、nextInt()、nextDouble()、nextLine()

        当next()、nextInt()、nextDouble()等等这些之后,你如果不再加一条in.nextLine()的话,下面如果用到了类似str = in.nextLine(); 这条语句的话,会首先读取上面next()、nextInt()、nextDouble()等等这些语句的回车作为一条默认的字符串(为什么是这样的机制呢?还需要继续探索),因此,解决的办法就是在输入next()、nextInt()、nextDouble()等等这些之后,再用一个in.nextLine()这个来截取上面的一个回车操作,后面的nextLine()在第一次才能起作用。(这真是一个大坑!)

    注 静态方法

       声明为static的方法有以下几条限制(main也是??):

       A.它们仅能调用其他的static 方法;

       B.它们只能访问static数据;

       C.它们不能以任何方式引用this 或super(this涉及到对象,super 与继承有关);

       D.非静态可以调用静态。

    注 HTTP会话过程包括四个步骤

        连接(Connection);请求(Request);应答(Response);关闭(Close)

        HTTP协议是基于TCP/IP之上的协议,它不仅保证正确传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等等。

        HTTP协议定义了内容的格式,这是一个应用层的协议,应用层协议的内容需要通过传输层在浏览器和服务器直接传送,TCP/IP是网络模型的实现,其中传输层和应用层为主要层。

       应用层用于在特定的应用程序之间传输数据。HTTP协议就是TCP/IP协议中专门用于浏览器与Web服务器之间通信的应用层协议。应用层协议依赖于传输层协议完成数据传输,传输层协议依赖于网络层协议完成数据传输。

        ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。如下图所示,是TCP/IP参考模型和OSI参考模型的对比示意图。

    注 TCP/IP参考模型的层次结构及应用协议

    TCP/IP参考模型分为四个层次:应用层、传输层、网络互连层和主机到网络层。如下图所示。(PS:DNS亦是应用层协议

    注 广度优先搜索&&深度优先搜索

           广度优先搜索需要借助辅助队列记录访问顺序。

    DFS_BFS.java

     

    package cn.edu.ujn.graph;
    import java.util.ArrayList;
    import java.util.LinkedList;
    /**
     * @description 邻接矩阵模型类
     * @author SHQ
     * @time 2016.09.12
     */
    public class DFS_BFS {
        private ArrayList<Object> vertexList;// 存储点的链表
        private int[][] edges;	 // 邻接矩阵,用来存储边
        private int numOfEdges;	 // 边的数目
        boolean[] isVisited;	 // 遍历标志位
     
        public DFS_BFS(int n) {
            //初始化矩阵,一维数组,和边的数目
            edges = new int[n][n];
            vertexList = new ArrayList<Object>(n);
            numOfEdges = 0;
            // 将所有节点访问标志位均置为未访问
            isVisited = new boolean[n];
            for(int i = 0; i < n; i++){
            	isVisited[i] = false;
            }
        }
     
        //得到结点的个数
        public int getNumOfVertex() {
            return vertexList.size();
        }
     
        //得到边的数目
        public int getNumOfEdges() {
            return numOfEdges;
        }
     
        //返回结点i的数据
        public Object getValueByIndex(int i) {
            return vertexList.get(i);
        }
     
        //返回v1,v2的权值
        public int getWeight(int v1,int v2) {
            return edges[v1][v2];
        }
     
        //插入结点
        public void insertVertex(Object vertex) {
            vertexList.add(vertexList.size(),vertex);
        }
     
        //插入结点
        public void insertEdge(int v1,int v2,int weight) {
            edges[v1][v2]=weight;
            numOfEdges++;
        }
     
        //删除结点
        public void deleteEdge(int v1,int v2) {
            edges[v1][v2] = 0;
            numOfEdges--;
        }
     
        //得到第一个邻接结点的下标
        public int getFirstNeighbor(int index) {
            for(int j = 0; j < vertexList.size(); j++) {
                if (edges[index][j] > 0) {
                    return j;
                }
            }
            return -1;
        }
     
        //根据前一个邻接结点的下标来取得下一个邻接结点
        public int getNextNeighbor(int v1, int v2) {
            for (int j = v2+1; j < vertexList.size(); j++) {
                if (edges[v1][j]>0) {
                    return j;
                }
            }
            return -1;
        }
        
        //私有函数,深度优先遍历
        private void depthFirstSearch(boolean[] isVisited,int  i) {
            //首先访问该结点,在控制台打印出来
            System.out.print(getValueByIndex(i) + "  ");
            //置该结点为已访问
            isVisited[i] = true;
            
            int w = getFirstNeighbor(i);
            while (w != -1) {
                if (!isVisited[w]) {
                    depthFirstSearch(isVisited,w);
                }
                w = getNextNeighbor(i, w);
            }
        }
        
        //对外公开函数,深度优先遍历,与其同名私有函数属于方法重载
        public void depthFirstSearch() {
            for(int i = 0; i < getNumOfVertex(); i++) {
                //因为对于非连通图来说,并不是通过一个结点就一定可以遍历所有结点的。
                if (!isVisited[i]) {
                    depthFirstSearch(isVisited,i);
                }
            }
        }
        
        /**
         * 私有函数,广度优先遍历
         * 遍历步骤:
         * 访问初始结点v并标记结点v为已访问。
         * 结点v入队列
         * 当队列非空时,继续执行,否则算法结束。
         * 出队列,取得队头结点u。
         * 查找结点u的第一个邻接结点w。
         * 若结点u的邻接结点w不存在,则转到步骤3;否则循环执行以下三个步骤:
         * 1)若结点w尚未被访问,则访问结点w并标记为已访问。
         * 2)结点w入队列
         * 3)查找结点u的继w邻接结点后的下一个邻接结点w,转到步骤6。
         * @param isVisited
         * @param i
         */
        private void broadFirstSearch(boolean[] isVisited, int i) {
            int u, w;
            // 借助辅助队列,记录访问顺序
            LinkedList<Object> queue = new LinkedList<Object>();
            // 访问结点i
            System.out.print(getValueByIndex(i) + "  ");
            isVisited[i] = true;
            // 结点入队列
            queue.addLast(i);
            while (!queue.isEmpty()) {
                u = ((Integer)queue.removeFirst()).intValue();
                w = getFirstNeighbor(u);
                while(w != -1) {
                    if(!isVisited[w]) {
                            //访问该结点
                            System.out.print(getValueByIndex(w)+"  ");
                            //标记已被访问
                            isVisited[w] = true;
                            //入队列
                            queue.addLast(w);
                    }
                    //寻找下一个邻接结点
                    w = getNextNeighbor(u, w);
                }
            }
        }
        
        //对外公开函数,广度优先遍历
        public void broadFirstSearch() {
            for(int i = 0; i < getNumOfVertex(); i++) {
                if(!isVisited[i]) {
                    broadFirstSearch(isVisited, i);
                }
            }
        }
    }

     

    main.java

     

    package cn.edu.ujn.graph;
     
    public class Main {
        public static void main(String args[]) {
            int n = 8, e = 9; // 分别代表结点个数和边的数目
            String labels[]={"1","2","3","4","5","6","7","8"};	//结点的标识
            DFS_BFS graph = new DFS_BFS(n);
            for(String label : labels) {
                graph.insertVertex(label);	// 插入结点
            }
            //插入九条边
            graph.insertEdge(0, 1, 1);
            graph.insertEdge(0, 2, 1);
            graph.insertEdge(1, 3, 1);
            graph.insertEdge(1, 4, 1);
            graph.insertEdge(3, 7, 1);
            graph.insertEdge(4, 7, 1);
            graph.insertEdge(2, 5, 1);
            graph.insertEdge(2, 6, 1);
            graph.insertEdge(5, 6, 1);
            graph.insertEdge(1, 0, 1);
            graph.insertEdge(2, 0, 1);
            graph.insertEdge(3, 1, 1);
            graph.insertEdge(4, 1, 1);
            graph.insertEdge(7, 3, 1);
            graph.insertEdge(7, 4, 1);
            graph.insertEdge(6, 2, 1);
            graph.insertEdge(5, 2, 1);
            graph.insertEdge(6, 5, 1);
            
    /*        System.out.println("深度优先搜索序列为:");
            graph.depthFirstSearch();
            System.out.println();*/
            System.out.println("广度优先搜索序列为:");
            graph.broadFirstSearch();
        }
    }

     

    附 阿里变态附加题

     

    附 sort()方法在J6、J7中的区别

       在Java 6中Arrays.sort()和Collections.sort()使用的是MergeSort,而在Java 7中,内部实现换成了TimSort,其对对象间比较的实现要求更加严格:

    Comparator的实现必须保证以下几点(出自这儿):

        a). sgn(compare(x, y)) == -sgn(compare(y, x))

        b). (compare(x, y)>0) && (compare(y, z)>0) 意味着 compare(x, z)>0

        c). compare(x, y)==0 意味着对于任意的z:sgn(compare(x, z))==sgn(compare(y, z)) 均成立

        PS: TimSort不仅内置在各种JDK 7的版本,也存在于Android SDK中(尽管其并没有使用JDK 7)。

    美文美图

     

    展开全文
  • 五大行证券校招笔试题真题模拟题面试技巧企业文化发展动态
  • 阿里巴巴2015校招笔试题
  • 剑指Offer(Java岗)——CVTE校招笔试题+知识点总结 2016.9.3 19:00参加CVTE笔试,笔试内容如下: 需要掌握的知识:Linux基本命令、网络协议、数据库、数据结构。选择题 1.36进制转换(0~9, A~Z):28045707425转换结果为...

    剑指Offer(Java岗)——CVTE校招笔试题+知识点总结

          2016.9.3 19:00参加CVTE笔试,笔试内容如下:

       需要掌握的知识:Linux基本命令、网络协议、数据库、数据结构。

    选择题

        1.36进制转换(0~9, A~Z):28045707425转换结果为...P

        2.已知二叉树的节点数,求树的最低深度。

         考察二叉树中树的深度与节点数目的关系

          二叉树的性质

          性质1 在二叉树的第i层上至多有2(i-1)个节点(i>=1).

          性质2 深度为k的二叉树至多有2k-1个节点(k>=1).

          性质3 对任何一棵二叉树T,若叶子节点数为m,度为2的节点数为n,则m=n+1.

          性质4 具有n个节点的完全二叉树的深度为log2n(向下取整)+1。

     性质5:如果对于一棵有n个节点的完全二叉树(其深度depth=log2n+1下取整)的节点按层序编号(从第一层到第depth层,每层从左到右),对任一节点i(1 <= i <= n):
                            1.如果i=1,则节点i是二叉树的根,无双亲;如果i>1,则其双亲节点是i/2(下取整)。
                            2.如果2i>n,则节点i无左孩子(节点i为叶子节点);否则其左孩子是节点2i;
                            3.如果2i+1>n,则节点i无右孩子;否则其右孩子节点为2i+1。

          一棵深度为k且有2k-1个结点的二叉树称为满二叉树。

    编程题

    1.全排列 

     public class FullPermutation {
      
        /**
         * @author SHQ
         */  
        public static void main(String[] args) {
                List<Integer> s = new ArrayList<Integer>();  
                List<Integer> rs = new ArrayList<Integer>();
                for(int i = 1; i <= 3; i++)  
                    s.add(i);
                pl(s,rs);
        }
        
        public static void pl(List<Integer> s,List<Integer> rs){
              
        	 // 递归出口
              if(s.size()==1)
              {  
                  rs.add(s.get(0));  
                  System.out.println(rs.toString());  
                  rs.remove(rs.size()-1);  
              }else{
                  for(int i = 0; i < s.size(); i++){
                      rs.add(s.get(i));   
                      List<Integer> tmp = new ArrayList<Integer>();  
                      for(Integer a:s)
                         tmp.add(a);
                      tmp.remove(i);
                     pl(tmp,rs);
                     rs.remove(rs.size()-1);      
                  }  
              }                     
         }
      }

     

    2.判断回文串的最大长度。

    附 58校招笔试内容总结

        1.根据二叉树的先序遍历、后序遍历,得出中序遍历结果。

     

        已知前序遍历序列和中序遍历序列,可以唯一确定一颗二叉树。

          已知后序遍历序列和中序遍历序列,可以唯一确定一颗二叉树。

          已知前序遍历序列和后序遍历序列,是不能确定一颗二叉树的。

        2.各种排序算法中时间复杂度为O(nlogn),且稳定的排序算法

          参考博文:http://blog.csdn.net/sunhuaqiang1/article/details/52060981

     

     

    3.编程题。斗地主找顺子,随机抽取5张牌,若5张牌为连续,则为顺子。大小王为任意数,A为0,J,Q,K分别为11,12,13.                                                                   

        4.突然想起菜鸟网络面试时面试官所问的问题:快排与冒泡排序算法的对比,时间复杂度的含义。

        在内排序中,主要进行两种操作:比较和移动。其中时间复杂度由比较和移动次数决定。

          原来当时自己的回答是如此的不靠谱啊!

    美文美图

     

    展开全文
  • 深信服校招笔试题

    2012-10-24 14:59:58
    深信服校招笔试题,题目不是很容易,内容比较杂
  • 腾讯2013校招笔试试题

    2013-04-19 17:36:00
    腾讯2013校招笔试试题,值得拥有,没错的
  • 2014美团校招笔试题

    热门讨论 2013-10-12 08:21:14
    美团校招笔试题,通过中序遍历和后序遍历求前序遍历(略) 2. 一个二进制序列,从右边第一个1开始连续
  • 2016各大IT公司校招笔试题大合集
  • 摩拜2018校招笔试题(非技术类)
  • 点我达2019校招笔试题-开发合集
  • 主要为大家详细介绍了华为2019校招笔试题之处理字符串,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 2020年校招笔试真题(附答案) ,万德上海软件开发工程师笔试试题及答案,考察主要内容为C++、计算机网络知识,两道编程
  • 2014年宇视科技校招笔试题

    热门讨论 2014-03-01 21:50:08
    2014年宇视科技校招笔试题,安防类第三名,精工企业,图像处理类算法题,有参考价值,但是题目不多,都是自己亲自采集来的,所以分值较高。
  • 各大企业2014年软件类校招笔试题

    热门讨论 2013-10-10 08:53:14
    2014.09.28百度南京校招笔试题 2014年阿里巴巴校招笔试题北京站(涉及C++,JAVA,数据结构) 2014年微软校园招聘笔试题 百度2014校园招聘-研发工程师笔试题(济南站) 京东2014年校园招聘笔试题 2012年腾讯实习生笔试...
  • Hulu 2013北京地区校招笔试题
  • 武汉多比特C++实习-校招笔试题 文章目录武汉多比特C++实习-校招笔试题前言代码分析题1. 找出代码的错误,考的是C++ 里面的 虚函数(virtual)2. 32位和64位系统下的 结构体字节对齐:3. 指针相关,写出下列程序的...
  • Hulu_2013北京地区校招笔试题
  • 2014年博康智能校招笔试题,题目不多,但是挺有意思的,涉及到一些算法,看看也许有帮助的。
  • 2018校招笔试真题汇总

    2018-06-08 15:11:00
    2018校招笔试真题汇总 科大讯飞: 2018秋招笔试科大讯飞java笔试试题 https://www.nowcoder.com/discuss/67684?type=2&order=3&pos=13&page=0 锐捷: 2018秋招锐捷笔试试题 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,671
精华内容 1,468
关键字:

校招笔试题