求程序员面试100题指教这个题:用repeat结构代替while结构重写下面的程序段,确保它能够输出与原程序相同的值。

单向链表的反转是一个经常被问箌的一个面试题也是一个非常基础的问题。比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1

最容易想到的方法遍历一遍链表,利用一个辅助指针存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后利用已经存储的指针往后面继续遍历。源代码如丅:

还有一种利用递归的方法这种方法的基本思想是在反转当前节点之前先调用递归函数反转后续节点。源代码如下不过这个方法有┅个缺点,就是在反转后的最后一个结点会形成一个环所以必须将函数的返回的节点的next域置为NULL。因为要改变head指针所以我用了引用。算法的源代码如下:

尝试写出类的成员函数实现

一种O(n)的办法就是(搞两个指针,一个每次递增一步一个每次递增两步,如果有环的話两者必然重合反之亦然):

}
    • 自定义安装位置(尽量不要安装茬 C 盘里面);
  1. 服务器进程:运行之后才可以工作;
  1. 用来查看 Apache 具有哪些功能以及配置文件是否出现错误;httpd 或者 httpd.exe 文件所在目录;

  1. 让 Apache 确定服务器仩访问的位置:网站文件夹所在位置;

  2. 方便用户使用名字访问对应的网站:给文件夹对应的取一个别名;

    2.1. 解开注释痛死可以把端口给去掉,因为端口可以单独的设置;

    conf文件里面有一个 listen 可以实现监听端口的变化

  3. 凡是涉及到 Apache 配置文件的修改都需要重新启动 Apache 服务器才可以生效

  4. 实现 DNS 域名解析:通常默认站点都是本地 DNS:hosts 文件;

  1. 获取 PHP 安装文件:建议去官网;

  2. 安装:放到自定义的文件夹下面

  3. PHP 文件的目录结构;

    1. php.exe 就是可以解析 PHP 代码转变成 HTML 代码,从而实现浏览器的解析功能;

  1. 将 PHP 的配置文件加载到 Apache 的配置文件中:共同生效;

    1. 只需要在 Apache 中指定 PHP 的配置文件所在目录;

    2. PHP 的配置文件已经添加到了 Apache 的配置文件目录中需要重启 Apache 才能生效;

  1. 选择 custom:自定义安装,选择安装路径;

  • 选择开发环境(选择默认的);

  • 選择功能(默认选中);

  • 并发设置(建议手动设置);

  • 字符集设定:系统字符集;

  • 服务安装:将 MySQL 作为 windows 下的一个服务启动;

  • 输入 Root 超级管理员嘚用户密码:一般我们使用 root;

  • 等待配置即可实现安装;

    1. C/S:Client 客户端/Server 服务端用户只需要安装客户端产品才能访问服务器,而且只能访问一种软件(当前自己);
    2. B/S:Browser 浏览器/Server 服务端用户只需要安装浏览器,就可以访问所有的服务器(B/S 架构服务);

    MySQL 是一款 c/s 架构的软件需要通过客户端來访问服务端(ps:MySQL 也提供了其他的访问方式:通过插件扩展的方式来充当客户端访问)

  • MySQL 客户端访问服务器端需要进行寻找匹配:连接认证

    連接: IP 和端口确认,如果是本地都可以省略;

    • -u 用户名 —> -uroot ,不可以省略(匿名用户除外);

  • 
    

    PS:通常连接认证的时候密码不建议明文可以在输入-p の后回车,系统会再次让输入密码这个时候就是密文

  • PHP 本身不具备操作 MySQL 的能力,需要借助 PHP 操作 MySQL 的扩展进行实现

    1. PHP 中所有的扩展都是在 ext 文件夹Φ需要指定扩展所在路径:extension_dir

    2. 加载之后需要重新启动 Apache 服务器

    一台服务器很贵,如果只能部署一个服务器的话则是非常的浪费,所以通过其他的渠道实现一台主机上面部署多个网站

    虚拟主机:virtual machine ,并不真实存在的主机但是可以提供真实主机所实现的功能;通俗的讲,虚拟主机就是将计算机中不同的文件夹进行不同的命名然后让服务器(Apache)根据用户的需求从不同的文件夹(网站)读取不同的内容。

    在 Apache 中鈳以将虚拟主机划分为两类;

    1. 基于 IP 的虚拟主机:一台电脑有多个 IP,每个 IP 对应一个网站;

      原理:电脑默认只有一个 IP因为电脑默认只配备一個网卡,但是有的电脑可以配备多个网卡每个网卡可以绑定一个 IP 地址;

    2. 基于域名的虚拟主机:一台电脑只有一个 IP,但是 IP 下可以制作多个網站但是需要给每个网站不同的名字(虚拟主机名);

    PHP 是一种可以运行在服务器端的脚本语言,可以嵌入到 HTML 中

    在 PHP 的发展历史中可以使鼡多种标记来区分 PHP 脚本

    • 前面两种标记基本已经废弃,但是如果使用的话还是可以使用的,需要在我们的 php 配置文件中进行配置

    在 PHP 中语句的汾隔符是英文下的分号 ;
    特殊说明:PHP 中标记结束符 ?> 有自带语句结束符的作用最后一行 PHP 代码可以没有语句分隔符;

    PHP是一种动态网站开发的脚夲语言,动态语言特点就是交互性会有数据的传递,而PHP作为“中间人”需要进行数据的传递,PHP可以自己保存数据

    变量来源于数学,昰计算机语言中能存储计算结果或能表示抽象概念变量可以通过变量名字来访问。在指令式语言中变量通常是可变的的。

    1. 变量是用来存储数据的;
    2. 变量是通过名字进行访问的;

    PHP 的所有所有变量都是使用 “$” 进行定义;

    1. 定义:在系统中增加对应的变量名称(内存);

    2. 赋值:可以将数据赋值给变量名(可以在定义的同时完成);

    3. 可以通过变量名称访问存储的数据;

    4. 可以将变量从内存中删除;

    
    
    1. 在 PHP 中变量名称必須使用 “ $ ”进行开头;
    2. 名字由字母、数字和下划线 “_”,但是不能以数字开头;
    3. 在 PHP 中允许中文变量(不建议使用);

    预定义变量:提前定義的变量、系统定义的变量,存储许多我们需要的数据(预定义变量都是数组)

    • $_GET 获取表单 以“get”方式提交的信息;
    • $_FILES 用户上传的文件信息

    鈳变变量:如果一个变量保存的值刚好是另外一个变量的名字,那么直接可以通过访问一个变量得到另外一个变量的值:在变量前面再多加一个 “$”号;

    将一个变量赋值给另一个变量:变变量传值;变量传值两种方式:值传递引用传递

    值传递:将变量保存的值复制一份,然后将新的值给另外一个变量进行保存(两个变量之间没有关系);

    引用传递:将变量保存的值所在内存地址传递给另一个变量:两個变量指向同一块内存空间(两个变量是同一个值);

    在内存中,通常存在一下几个分区:
    栈区 :程序可以操作的内存部分(不存数据,运行程序代码)少但是快;
    代码段:存储程序的内存部分(不执行);
    数据段:存储普通数据(全局区和静态区);
    堆区 : 存储复杂數据,大但是效率低;

    1. 也被称之为内部变量局部变量是在函数内部定义的,其作用域仅限于函数内部离开函数后变量使用是错误的

    2. 全局变量是用global定义的,从程序的开始可以一直存在程序的结尾定义的常量就是全局的,不需要使用global关键字进行定义可以在脚本的任何位置进行使用

    3. 使用static关键字进行定义的变量

      函数执行完成之后不会立即消失,当再次调用函数时静态变量保存的值依然存在,并且仅在第一佽执行函数的时候会初始化值

    常量和变量一样都是用来保存数据的;

    常量:const/constant,是一种在程序运行当中不可改变的量(数据);常量一旦被定义,通常数据不会改变(用户级别);

    在PHP中存在两种定义的方式(5.3之后才有两种);

    1. 使用定义常量的函数:define(“常量名”“常量值”);
    2. 5.3之后才有的:const 常量名=常量值
    1. 常量不需要使用“$”进行命名,一旦使用系统就会认为是变量;
    2. 常量的名字组成由数字、字母、下划线组荿不能以数字开头;
    3. 常量的名称通常都是以大写字母为主,主要是为了和变量进行区分;
    4. 常量的命名规则比较松散可以使用一些特殊芓符,该方式只能使用define()函数进行定义;
    1. define函数和const定义区别:在与访问权限区别;
    2. 定义常量通常不区分大小写但是可以区分,可以参照define函数嘚第三个参数;
    3. 访问特殊字符的常量的时候需要使用constant(“常量名称”)函数;

    系统常量:系统帮助用户定义的常量,用户可以直接使用;

    1. PHP_INT_MAX:整形可以表示的最大值(PHP中的整形是允许出现负数:带符号);

    在PHP中存在特殊的常量以双下划线开头加常量名称,然后双下划线结尾通瑺跟随系统改变,但是用户改变不了

    1. __ DIR __:当前被执行文件的绝对路径;
    2. __ FILE __:当前被执行文件的绝对路径(带自己文件的名字);

    数据类型:data type,在PHPΦ指的是存储数据本身的数据类型而不是变量 的类型,PHP是一种弱类型的语言变量本身没有数据类型。

    1.PHP的八种数据类型

    简单数据类型:4個小类

    1. 整形:int/integer ,系统分配4个字节存储表示整数类型(有前提);
    2. 浮点型:float/double,系统分配8个字节存储,表示小数或者整形存不下的整数;
    3. 字符串型:string系统根据实际长度分配,表示字符串(引号);

    复合数据类型:2个小类

    1. 对象类型:object存放对象(面向对象);
    2. 数组类型:array,可以一佽性存储多个数据;

    特殊数据类型:2个小类

    1. 资源类型:resource存放资源数据,例如:PHP外部资源如数据库、文件;
    2. 空类型:null,只有一个值不能参与运算;

    除了以上几种还有一种特别的数据:伪类型,主要有两种数据

    mixed:混合的可以是多种PHP中的数据类型

    number:数值的可以是任意数值類型,整型或者浮点型

    在PHP中存在两种转换规则:

    1. 自动转换:根据系统的需求自己判定自己转换,使用较多(但是效率比较低);
    2. 强制转換:人为根据需要进行目标类型数据转换;

    在转换的过程中使用较多的转布尔类型(判断)和转数值类型(算术运算);

    其他类型转布尔類型:true或者false在PHP中很少的转换false;

    强制转换规则:在变量之前增加一个括号(),然后在括号里面写上对应的数据类型:其中NULL类型需要用到unset()函数;

    ? 其他类型转数值的说明:

    1. 字符串转数值有自己的规则;
      1. 以字母开头的字符串永远为零;
      2. 以数字开头的字符串,取到碰到字苻为止(不会同时包含两个小数点);

    通过一组函数进行数据类型的判断最终返回这个变量所保存数据的数据类型,(相同结果为true否則为false),是以is__开头的后面跟上数据类型的函数例如:is_int(),判断数据是否为整形。

    Bool类型的数据不能通过echo函数进行查看需要通过var_dump()进行操作。

    还有一种类型的函数可以输出数据类型对应的字符串;

    1. gettype(变量名):获取类型得到改数据类型对应的字符串;
    2. settype(变量名,数据类型):设萣数据类型,与强制转换不同;
      1. 强制转换是对数据值复制的内容进行处理(不会处理实际存储的内容);
      2. settype会直接改变数据本身;

    保存整数数徝(范围限制)4个字节存储数据,最大就是32位:42亿多但是在PHP中默认是有符号类型,用来区分正负数,默认PHP输出的都是十进制

    在PHP中提供叻四种定义整型的方式:

    二进制:逢2进1,能够出现的数字是0-1;

    八进制:逢8进1能够出现的数字是0-7;

    十进制:逢10进1,能够出现的数字是0-9;

    16进制:逢16进1能够出现的数字是0-9,以及a-f其中a表示10,以此类推;

    十进制转二进制:除2倒取余法;

    不管得到的结果如何需要补足32位:前面补0,:00 ;

    1. decbin():十进制转二进制;
    2. decoct():十进制转八进制;
    3. dechex():十进制转十六进制;
    4. bindec():二进制转十进制;

    浮点型:小数类型以及超过整形所能存储范围的整数(不包括精度)精度范围大概在15个有效数字左右;

    尽量不要使用浮点数进行精确判断:浮点数保存的数据不够精确,而且在计算机中凡是小数基本上存的都不准确;

    布尔类型:只有true和false通常使用在判断中。

    但是在进行某些判断的时候要特别注意类型判断

    1. empty():判断数值是否为空,如果为空返true否则false;
    2. isset():判断数据存储变量本身是否存在,存在即为true否则为false;
    1. 引号方式适合定义比较短(不超过一行)或者没有语法结构要求的字符串,如果超过一行或者有语法结构可以使用下面的定义方式

    2. nowdoc字符串:没有单引号的单引号芓符串

    3. heredoc字符串:没有双引号的双引号字符串

      
      

    含义:在计算机通用协议中有一些特定的方式定义的字母,系统会进行特定处理通常使用反斜杠+字母进行处理例如:\r\n

    在PHP中识别转义符号也是同样的模式:反斜杠+字母

    \ ’ 在单引号字符串中显示单引号

    \ " 在双引号字符串中显示双引号

    \ r玳表回车,理论上是回到当前行的首位置

    \ t代表tab 类似换行,输出四个空格

    \ $ 在PHP中使用 ¥符号作为变量符号因此需要特定识别

    1. 双引号中可以识别變量,单引号不可以在双引号中要保证变量的独立性,可以使用{} 对变量进行对立性处理

    结构化定义字符串的规则:

    1. 上边界符后面不可以哏任何的内容
    2. 下边界符必须顶格使用而且只能跟分号,不能跟其他任何的内容
    3. 边界符之间所有的内容都是字符串本身

    基本函数问题:strlen()获取到字符的长度是以字节为单位的

    使用mbstring模块进行字符串的扩展使用,需要在PHP配置文件(php.ini)中进行释放strlen针对的是标准的ASCII码,而mbstring模块针对嘚是多种字符集的

    1. implode:将数组用一定的规则连接成字符串

      explode:将字符串按照一定的规则进行分割

      str_split: 将一个字符串按照规定的长度进行切割成数组

    2. trim: 去除字符串首尾处的空白字符(或者其他字符)

      ltrim:去除左边的空格

      rtrim:去除右边的空格

    3. substr:从指定位置开始截取指定长度的字符串

      strstr:从指萣位置开始截取到最后,可以用在取文件名字

    4. strpos: 查找字符串首次出现的位置

      strrpos:计算指定字符串在目标字符串中最后一次出现的位置

    5. 格式化函数:格式化输出数据

    数组:array数据的组合,将一组数据存储到指定的容器中用变量指向该容器,然后通过变量取得容器中的所有数据

    茬PHP中有多种定义Array的语法

    1. 使用array关键字这也是最常使用 $变量=array (元素1,元素2元素3,。。)
    2. 使用中括号:$变量=[元素1,元素2元素3,…]
    3. 隐形定义数组:$变量[]=值 $变量[下标]=值
    1. 数组的下标可以是数字或者字符串

      1. 如果数组下标为整数称之为索引数组
      2. 如果数组下标为字符串,称之为關联数组
    2. 不同的下标可以同时存在称之为混合数组

    3. 数组元素的顺序以放入顺序为准,与下标大小无关

    4. 下标的自增长特性:从0开始自动增長如果手动添加更大的,那么后面自增元素从最大的值+1开始

    5. 特殊下标的自动转换,不要使用特殊含义的下标

    6. PHP数组中元素没有数据类型限制

    7. PHP數组元素没有长度限制

    8. PHP数组是很大的数据所以存储在堆区,为当前数组分配一块连续的空间存储

    1. 多维数组:数组里面的元素又是数组

    2. 数組中所有的元素都是一样一维数组但是不建议使用超过三维以上的数组,会增加访问的复杂度降低访问效率

    3. 异型数组(不规则数组)

      異型数组:数组中的元素不规则,有普通基本变量也有数组在实际的开发过程中,并不常见开发过程中尽量让数组元素规则化,便于進行访问

    数组遍历:普通数据的访问都是通过数组元素的下标实现访问如果说数组中所有的数据都需要依次输出出来,就需要我们使用箌一些简化的规则 来实现自动获取下标以及输出数组元素

    使用forEach进行多维数组的解构

    遍历原理:数组内部有一个指针默认指向数组的第一個元素,利用指针去获取元素同时移动指针

    1. foeach会重置指针:让指针指向第一个元素
    2. 进入foreach循环:通过指针取的当前的第一个元素,然后将下標取出放到对应的变量 k e y 中 将 对 应 下 标 对 应 的 值 放 到 key中,将对应下标对应的值放到 keyvalue中,然后指针下移
    3. 进入循環体内部循环开始执行
    4. 重复执行2和3,直到数组的下标不存在即为结束
    3.for循环遍历数组
    1. 需要数组下标是规则的数字
    
        

    each函数:返回数组中当前嘚键/值对并将数组指针向前移动一步,如果最后each取不到结果则返回false

    list函数:不是一种函数,而是一种结构把数组中的值赋给一组变量

    1. list鈈能对字符串起作用
    1. 排序函数:对数组元素进行排序,按照ASCII码进行比较可以进行英文比较

      sort:顺序排序(下标重排)

      asort:顺序排序(下标保留)

      ksort:顺序排序:对数组的键名进行排序

      shuffle:随机打乱数组元素

    2. reset:重置指针,将数组指针回到首位

      end:重置指针将数组元素回到最后一个元素

      next:指针下移,取得下一个元素的值

      prev:指针上移取的上一个元素的值

      current:获取当前指针对应的元素的值

      key:获取当前元素对应的下表值

      注意倳项next和prev会移动指针,有可能会导致指针移动的最前或者最后(离开数组)导致数组不能使用,通过next和prev不能回到真正准确指针位置只能通过end和reset进行指针重置

    3. count:统计数组中的元素的数量

      array_push:往数组中加入一个元素,数组后面

      array_pop:从数组中取出一个元素数组后面

      array_shift:从数组中取出一个元素,数组前面

      array_unshift:从数组中加入一个元素数组前面

      栈:压栈,先进去后出来(FILO)

      队列:排队先进去的先出去(FIFO)

      in_array:判断一个元素是否存在数組中

      array_keys:获取一个数组的所有下标,返回一个索引数组

      array_values:获取一个数组的所有value值返回一个索引数组

    运算符:operator,是一种将数据进行运算的特殊符號在PHP中存在数十种。

    赋值运算:符号 “=”;

    算数运算:算数基本操作

    %:取余(模)运算整数相除,保留余数第二个参数不能为0,0不能作为被除数;

    通常是比较两个数据的大小或者两个数据是否相等;

    “>”:左边大于右边;

    “>=”:左边大于等于右边;

    “<”:左边小于右边;

    “<=”:左边小于等于右边;

    “==”:左右大小相等;

    “!=”:左边和右边不同;

    “===”:左右大小和类型全部相等;

    “!==”:大小或者类型不同;

    逻辑运算:針对不同的结果进行匹配,满足为true不满足为false;

    && :逻辑与,两边的条件需要同时满足;

    | |:逻辑或左边或者右边的条件有一个满足即可;

    !:逻辑非,对已有的条件进行取反;

    连接运算:将多个字符串进行拼接的一种符号;

    . :将两个字符串连接到一起;

    在PHP中有一些错误可以提前预知泹是这些错误无法避免,但是又不希望报错给用户看可以使用错误抑制符;

    @ : 在可能出错的表达式前面使用“@”符号即可;

    通常会在生產(上线)环境会用到,在开发(编写代码)过程中一般不会使用;

    三目运算:有三个表达式参与的计算(简单的分支结构缩写);

    表达式1:表达式2:表达式3

    如果表达式1成立,则执行表达式2否则执行表达式3。表达式2和表达式3都可以是另外的三目运算;

    ++i:前置操作符先把洎己改变,然后把改变的值传给别人;

    i++:后置操作符,保留自己的值然后改变自己,把自己原来的值传给别人

    a=a+($b);如果进行除法或者取餘运算,那么考虑右边表达式的结果是否为0(为0就会出错);

    计算机码:计算机在实际存储数据的时候采用的编码标准(二进制规则);

    分为:原码、反码、补码。数据本身最左侧的一位用来充当符号位0代表正数,1代表负数

    原码:数据本身十进制转化二进制得到的结果

    ? 正数:最左侧符号位为0;

    ? 负数:最左侧符号位为1;

    反码:针对负数符号位不变,其他位置取反;

    补码:针对负数反码加1;

    ? 补码:(+1之后溢出了);

    位运算:取出计算机中最小的单位(bit)进行运算;

    &:按位与,两个位都为1结果为1,否则为0;

    |:按位或两个其中一个為1,结果为1否则为0;

    ~:按位非,一个位如果为1则变成0,否则反之;

    ^:按位异或两个相同则为0,否则为1

    <<:按位左移,整个位(32位)向左迻动一位,右边补0 相当于乘于2的操作

    “>>”:按位右移,整个位向右移动一位左边补符号位对应内容(正数补0,负数补1相当于除于2 的操作(不完全正确),整数除2会出现小数

    1. 系统进行任何位运算的时候都是使用的补码如果的是正数的情况下,原码和补码是一样的;
    2. 運算结束之后都必须转换成原码才是最终需要显示的数据;

    详情参考PHP运算符优先级

    流程控制:代码的执行方向;

    顺序结构:代码从上往下執行顺序执行。(代码执行的最基本结构);

    分支结构:给定一个条件同时有多种的可执行代码块,然后根据条件执行某一段代码;

    循环结构:在某个条件控制范围内指定的代码(块)可以重复执行;

    顺序结构:代码从上往下执行,顺序执行(代码执行的最基本结構);

    给定一个条件,同事为条件设置多种可执行情况然后通过条件判断来实现具体的代码执行段;

    1. 如果条件比较单一(同一个条件),会采用elseif的形式;
    2. 如果判断条件不一致的建议使用嵌套的语法(但是不宜嵌套过多);

    循环结构:代码段在一定的控制下,可以执行多佽;

    在PHP中循环结构有以下几种:

    for循环的特殊使用:for循环对应的小括号内(条件)可以一个都没有就是死循环了,尽量避免这个情况

    for循环的使用案例,PHP输出乘法口诀

    1. while循环的使用;
    1. do-while循环会至少执行一次,然后再去执行循环体

    在循环内部对循环本身进行控制

    中断控制:重新开始循环循环体中还有其他的内容,也再执行

    continue:层级默认是1(循环可以多层嵌套);

    内部循环可以控制到外部,就是通过使用层级参数

    continue2;//当湔自己循环后面内部不再执行,同时外部循环如果还有循环体本身也不再执行重新来过

    break2;//当前自己循环结束,同时外部也结束(如果还囿外部不受影响继续执行);

    PHP本身是嵌入到HTML中的脚本语言,需要在HTML中书写一些关于判断或者循环的结构语法必须符合PHP的标签规范,需偠HTML与PHP进行混搭如果使用原始的PHP代码,将会非常的不美观;

    PHP应该只在HTML中做数据输出输出通常伴有条件判断和循环操作,因此PHP提供了对应汾支结构和循环结构的替代语法:

    左大括号"{"使用冒号进行代替;

    右大括号"}"使用end+对应的标签名称进行代替;

    
    

    print():类似echo本质是一种结构,不是函數使用结果返回1,可以不用使用括号

    print_r():类似var_dump,但是比var_dump简单不会输出数据的类型,只会输出值在数组打印中使用较多。

    date():按照不同的格式对时间戳进行格式化时间默认是从1970年1月1日开始的(格林威治时间),详情参考PHP开发手册

    time():获取当前时间的时间戳

    max():指定参数中最大的值

    min():指定参數中最小的值

    rand():得到一个区间的随机数

    保存后再在浏览器中查看就不会显示乱码了

    1. 在文件加载include或者require的过程中系统会自动将被包含文件中的玳码相当于嵌入到当前文件夹中

    2. 加载位置:在哪里加载,对应的文件代码嵌入的位置就是对应的include的位置

    3. 在PHP中被包含的文件都是单独编译的

      包含的文件执行失败时那么直接失败,如果是被包含的文件代码出现语法错误系统会在执行到这个include的时候才会报错

    1. include系统碰到一次就会執行执行一次,如果include多次的话系统会执行多次
    2. include_once如果多次的话,系统只会执行一次

    require和include的区别:本质都是包含文件唯一的区别在于包含文件的报错形式不一样

    1. include的报错级别较低,不会影响后续代码的执行
    2. require的报错级别较高如果出错将会影响后续代码的执行,相当于是一个阻塞操作

    文件加载时候需要指定文件的加载路径才可以保证 PHP可以正确的寻找到对应的文件

    1. 从磁盘的根目录开始本地的绝对路径

      /:相对于网站主機名字对应的路径,例如

      
            
    2. 相对路径:从当前文件所在目录开始的路径

      “.“或者”./”:表示当前文件夹

      “…/”:表示上一级目录当前文件夹的仩一层

    1. 绝对路径相对来说效率偏低,但是比较安全路径不会出错
    2. 相对路径相对效率较高,但是容易出错因为相对路径会发生改变

    文件嵌套包含:一个文件包含另一个文件,同时另一个文件又包含了另外一个文件

    嵌套包含的时候很容易出现性对路径出错的问题:相对路径會因为文件的包含而改变./和…/的位置会发生改变

    函数:function一种语法结构,将实现某一个功能的代码块封装起来从而实现代码的复用。函數对应的以下几种关键点function关键字、函数名、参数、函数体、返回值

    目的:实现代码的可复用性

    由数字、字母、下划线组成,但是不能以數字开头

    遵循以下规则:函数名称代表相应的使用有些功能比较复杂,一个单词可能搞不定

    1. 驼峰法:除了左边第一个单词外后面所有嘚单词首字母都大写:getParentData()
    2. 下划线:单词之间通过下划线连接,单词都是小写:get_user_info()
    3. 在一个脚本周期中不允许出现同名函数,通常在一个系统的开發过程中不会出现同名函数

    函数参数分为:形参实参

    形参:形式参数,不具备实际意义的参数是在函数定义时使用的参数,形参是實参的载体

    实参:实际参数具有实际意义的参数,是在函数调用时使用的参数传入的实参可以是变量或者其他有值的表达式

    默认值:default value 指的是形参的默认值,在函数定义的时候就给形参进行一个初始化赋值,如果在实际调用的过程中没有传入实参则使用这个默认的形參值进行函数的运算

    实参在调用时会将值赋值给形参,那么实际上使用的就是一种简单的值传递形参与外部的变量本身没有任何的关联,但是有的时候我们希望在函数内部可以改变在函数外部定义的变量,这个时候需要告知函数函数才会在调用的时候去主动获取外部數据的内存地址。这种形式称之为引用传值

    **注意:**函数调用的时候一定要是变量,不可以是确切的数据否则会报致命的错误。

    函数体:大括号里面所有的代码都被称之为函数体

    函数体基本上所有的代码都可以实现

    返回值:return指的是将函数实现的结果,通过return关键字返回給函数外部(函数调用处),在PHP中所有的函数都有返回值如果没有使用return关键字,则默认返回值是NULL

    1. 函数返回值可以是任何的数据类型
    2. return代表函数执行结束return直接结束函数

    可变函数:一个变量保存的值刚好是一个函数的名字,那么就可以使用变量来充当函数名称进行使用,可变函數还是使用比较多的

    
    

    匿名函数:定义时候没有名字的函数,变量保存匿名函数本质是得到一个对象(Closure)

    闭包:closure为了使某个函数内部的变量鈈被释放

    作用域:变量、常量能够访问的区域

    1. 变量可以在普通代码中定义
    2. 变量也可以在函数中定义

    严格来说分为两种,但是在PHP中还定义了嚴格意义之外的一种

    1. 全局变量:用户普通定义的变量

      所属全局空间在PHP中只允许在全局空间中使用,理论上函数内部不可使用

      脚本周期:知道脚本运行结束

    2. 局部变量:函数内部定义的变量

      所属当前函数空间在PHP中只允许在当前函数自己内部使用

      函数调用:函数执行结束(函数昰在栈区开辟独立的运行空间)

    3. 超全局变量:系统定义的变量(预定义变量,$_POST )

      所属超全局空间:没有访问限制函数内外都可以访问,超全局变量会自动将全局变量归入到 G L O B A L S 中 GLOBALS中, GLOBALSGLOBALS没有作用域限制,可以帮助局部去访问全局变量但是必须使用数组的方式

    如果想在函數内部使用外部变量,除了**$_GLOBALS**外,还可以通过引用传值

    PHP中还有一种方式可是实现全局访问局部、局部也可以的访问全局:***global***关键字

    global关键字是一種在函数内部定义变量的一种方式

    1. 使用global关键字定义的变量,如果在外部全局变量存在相同名称那么就是同一个变量,指向同一个内存地址
    2. 使用global定义的变量外部不存在系统会自动在全局空间定义一个与局部变量同名的全局变量

    语法:global 变量名,不可以进行赋值

    虽然以上的方式可以实现全局变量和局部变量的 互相访问但是一般不会这样使用,如果使用的话也会使用参数的形式进行访问

    静态变量:static,是在函內部定义的函数使用static进行修饰,用于实现跨函数共享数据的变量函数运行结束后所有的局部变量都会消失,如果重新运行下一个函数所有的局部变量都会进行初始化

    1. 统计当前函数的调用次数
    2. 统筹函数多次调用得到的不同结果

    错误处理:指的是系统或者用户在对某些代碼进行执行的时候,发现有错误就会通过错误处理的形式告知程序员

    1. 语法错误:parse error,用户编写的代码不符合PHP的代码规范导致在编译过程Φ不通过,所以代码不会执行
    2. 运行错误:runtime error代码编译通过,但是代码在执行过程中会出现一些条件不满足导致的错误
    3. 逻辑错误:程序员在書写代码时候不够规范出现了一些逻辑性的错误,导致代码正常执行但是得不到想要的结果

    所有看到的错误代码在PHP中都被定义成了系統常量

    1. E_PARSE:编译错误,代码不会执行

      E_WARNING: 警告错误不会影响代码执行,但是会得到意想不到的结果

      E_NOTICE: 通知错误不会影响代码运行,只是影響美观

    2. 用户使用自定义错误触发的时候会用到的错误代号,系统不会用到

    3. 代表这所有的错误通常在进行错误控制的时候使用较多,建議在开发过程(开发环境)中使用

    所有E开头的错误常量都是一个字节存储然后每一种错误占据了一个对应的位,如果想进行一些错误的控制可以使用位运算进行操作,例如:

    1. 程序运行时触发:系统根据错误发生后对比对应的报错信息,输出给用户主要针对代码的语法囷运行时的错误
    2. 人为触发:知道某些逻辑可能会出错,从而使用对应的判断代码来触发相应的错误提示

    可以使用trigger_error(param1param2)函数对错误进行抛出,第②个错误可以进行设置类型

    错误显示设置:那些错误该显示以及该如何显示

    PHP中,有两种方式来设置当前脚本的错误处理

    1. PHP的配置文件:全局配置php.ini文件这种是全局的

    2. 在PHP脚本代码中去设置:在脚本中定义的配置项级别高于php.ini配置文件,所以我们一般需要在脚本中进行设置

    在实际苼产环境中不会直接让错误赤裸裸的展示给用户

    1. 不安全:会暴露网站的很多信息,路径、文件名

    所以在生产环境中一般不会显示错误,泹是不可避免的会出现错误这个时候不希望看到,但是又希望铺捉到可以让后台程序员进行修改需要在PHP配置文件中或者ini_set()设置对应嘚error_log配置项

    但是我们还可以通过set_error_handler()函数进行自定义报错处理

    
        

    编程思想: 利用数学模式,来解决对应的需求问题然后用代码来实现对应的數据模型

    算法:使用代码实现对应的数学模型,从而解决对应的业务问题

    一种比较简单的算法即通过已知条件,利用特定关系得出中间嶊论直至得到结果的算法。分为顺推逆推两种

    顺推:通过最简单的条件然后逐步推演结果

    逆推:通过结果找到规律,然后推到已知條件

    1. 
      

    递归算法:把问题转化为规模缩小了的同类问题的子问题然后递归调用函数来表示问题的解

    1. 简化问题:找到最优子问题

    递归思想比較重要的两点:

    1. 递归点:发现当前问题可以有解决当前问题的函数,去解决规模比当前小一点的问题来解决
    2. 递归出口:当问题解决的时候已经到达最优子问题,不能再次调用函数
    3. 如果一个函数递归调用自己没有递归出口那就是死循环

    递归的本质就是函数调用函数:一个函數需要开辟一块内存空间递归会n次的调用自己,递归的本质就是利用空间换取时间

    冒泡排序:bubble sort是一种计算机中的比较简单的排序算法。

    它重复地走访过要排序的数列一次比较两个元素,如果他们的顺序错误就把他们交换过来走访到没有需要交换,工作完成

    1. 比较相鄰的元素。如果第一个比第二个大就交换他们两个。

    2. 对每一对相邻元素做同样的工作从开始第一对到结尾的最后一对。在这一点最後的元素应该会是最大的数。

    3. 针对所有的元素重复以上的步骤除了最后一个。

    4. 持续每次对越来越少的元素重复上面的步骤直到没有任哬一对数字需要比较。

    
     
     
    

    选择排序:(Selection-sort)是一种简单直观的排序算法

    工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置然后,再从剩余未排序元素中继续寻找最小(大)元素然后放到已排序序列的末尾。以此类推直到所有元素均排序完毕,是┅种比较不稳定的排序方式

    
        

    插入排序:是一种简单直观的排序算法。它的工作原理是通过构建有序序列对于未排序数据,在已排序序列Φ从后向前扫描找到相应位置并插入,ta是稳定排序

    1. 从第一个元素开始该元素可以认为已经被排序;

    2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;

    3. 如果该元素(已排序)大于新元素将该元素移到下一位置;

    4. 重复步骤3,直到找到已排序的元素小于或者等于新え素的位置;

    5. 将新元素插入到该位置后;

    快速排序:通过一趟排序将待排记录分隔成独立的两部分其中一部分记录的关键字均比另一部汾的关键字小,则可分别对这两部分记录继续进行排序以达到整个序列有序。ta是不稳定的排序

    1. 从数组中选取一个元素(通常是第一个)作为参照对象
    2. 定义两个数组,将目标数组中剩余的元素与参照元素进行挨个比较小的放进一个数组,大的放进一个数组
    3. 第二步执行完荿之后前后的数组顺序不确定,但是可以确定自己的位置
    4. 将得到小数组按照1-3重复进行操作

    归并排序:是建立在归并操作上的一种有效的排序算法该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序若将两个有序表合并成一个有序表,称为2-路归并

    含义:查找是在大量的信息中寻找一个特定的信息元素,在计算机應用中查找是常用的基本运算,查找算法是指定实现查找过程中的代码结就是中大型数组中去快速定位想要的元素

    顺序查找:也称为線性查找,从数据结构线性表的一端开始顺序扫描,依次将扫描到的节点关键字与给定 值k相比较若相等则表示查找成功,若扫描结束仍没有找到关键字则扫描失败

    :当我们要从一个序列中查找一个元素的时候,二分查找是一种非常快速的查找算法二分查找又叫折半查找。它对要查找的序列有两个要求一是该序列必须是有序的(即该序列中的所有元素都是按照大小关系排好序的,升序和降序都可以本文假设是升序排列的),二是该序列必须是顺序存储的

}

4、关于Java的有两道没怎么注意

大意是有一个1001个元素的数组,每个元素都在1到1000这些整数中取值其中有一个数值

重复了,现在要设计一个算法找出这个数字且每个元素只能被访问一次。还有其他的要

求记得不是很清楚了,等回来的同学再补充吧

new 动态分配失败会抛出什么异常 ,C++ 中提供了那两个标准函数来設定异常处理 HANLDER?

}

我要回帖

更多关于 程序员面试100题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信