[关闭]
@Chiang 2019-12-24T14:16:23.000000Z 字数 2621 阅读 503

面试题

面试题


运算符优先级

  • 运算符优先级指定了两个表达式绑定得有多“紧密”。例如,表达式 1 + 5 * 3 的结果是 16 而不是 18 是因为乘号(“*”)的优先级比加号(“+”)高。必要时可以用括号来强制改变优先级。例如:(1 + 5) * 3 的值为 18。
  • 如果运算符优先级相同,那运算符的结合方向决定了该如何运算。例如,"-"是左联的,那么 1 - 2 - 3 就等同于 (1 - 2) - 3 并且结果是 -4. 另外一方面,"="是右联的,所以 b = a = (c)。
  • 没有结合的相同优先级的运算符不能连在一起使用,例如 1 < 2 > 1 在PHP是不合法的。但另外一方面表达式 1 <= 1 == 1 是合法的, 因为 == 的优先级低于 <=。
  • 括号的使用,哪怕在不是必要的场合下,通过括号的配对来明确标明运算顺序,而非靠运算符优先级和结合性来决定,通常能够增加代码的可读性。
  1. $a = 0;
  2. $a = (2 > 2) ? 2 : 3 ? $a++ : --$a;
  3. //解析:( false ? 2 : 3) ? $a++ : --$a
  4. // 3 ? $a++ : --$a
  5. var_dump($a);//0
  6. echo "<br>";
  7. $a = (2 > 2) ? 2 : 3 ? ++$a : --$a;
  8. var_dump($a);//1
  9. echo "<br>";
  10. $a = true ? 0 : true ? 1 : 2;// (true ? 0 : true) ? 1 : 2 = 2 左结合
  11. $a = 1;
  12. $b = 2;
  13. $a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5 右结合
  14. $a = 1;
  15. echo $a + $a++; //3

从mysql 数据库中随机取出一条记录

  1. select * from 表名 order by rand( ) limit 1; //此处的1就是取出数据的条数
  1. 最佳方式
  2. $total = Book::count() - 1;
  3. $skip = mt_rand(0, $total);
  4. $item = Book::select('name', 'author_id')->skip($skip)->take(1)->first();
  5. 耗内存的方式
  6. Book::inRandomOrder()->get();
  7. 等同于
  8. Book::orderByRaw("RAND()")->get();
  9. 耗内存的原因是,随机序需要建立临时表。
  10. 更加耗内存的 Collection 方案
  11. Book::all()->random(1);

用php写一段代码,实现不使用第3个变量,变换b的值,b初始值自己定

  1. 方法一:
  2. list($a, $b) = array($b, $a);
  3. 方法二:两个变量必须是数字
  4. $a=5; $b=7;
  5. $a = $a + $b;
  6. $b = $a - $b;
  7. $a = $a - $b;
  8. echo $a,$b;//7 5
  9. 方法三:(这个就比较有限制,必须用一个两个字符串都都不能出现的字符做为分隔符)
  10. $a = $b.','.$a ;
  11. $a = explode(',', $a);
  12. $b = $a[1];
  13. $a = $a[0];
  14. 方法四:可能存在编码问题
  15. $a = $a . $b;
  16. $b = strlen( $b );
  17. $b = substr( $a, 0, (strlen($a) - $b ) );
  18. $a = substr( $a, strlen($b) );
  19. 方法五:两个变量的长度必须一样
  20. $a = $a^$b;
  21. $b = $b^$a;
  22. $a = $a^$b;

char/varchar 区别,谁的存储速度快,为何?

一.数据存储开销

1.char(n) 是定长的,也就是当你输入的字符小于你指定的数目时,char(8),你输入的字符小于8时,它会再后面补空值。当你输入的字符大于指定的数时,它会截取超出的字符。

在程序中,会返回给你8位,后面的用空格补上;

在数据库中,char(8),占用16个字节(1个字符=2个字节);

2.varchar(n) 是长度为 n 个字节的可变长度且非 Unicode 的字符数据。n必须是一个介于1和 8000之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。

二.插入数据

1.char列的NULL值占用存储空间。

varchar列的NULL值不占用存储空间。

插入同样数量的NULL值,varchar列的插入效率明显高出char列。

插入不为null的数据时,无论插入数据涉及的列是否建立索引,varchar列的插入效率也是明显高出char列。

三.更新数据

如果更新的列上未建立索引,则char的效率低于varchar,但效率差异不大。

如果更新的列上建立索引,则char的效率低于varchar,并且效率差异很大。

四.修改结构

无论增加或删除的列的类型是char还是varchar,操作都能较快的完成,而且效率上没有什么差异。

对于增加列的宽度而言,char与varchar有非常明显的效率差异,varchar列基本上不花费时间,而修改char列需要花费很长的时间。

五.数据检索

无论是否通过索引,varchar类型的数据检索略优于char的扫描。

那实际开发中,我们使用哪种呢?

当确定字符串为定长、数据变更频繁、数据检索需求少时,使用char;

当不确定字符串长度、对数据的变更少、查询频繁时,使用varchar。

解释什么是队列(queue),栈(stack),有何区别,php哪些数组结合可以实现队列和栈?

栈(Stack)和队列(Queue)是两种操作受限的线性表。
队列(queue),栈(stack)

栈与队列的相同点:

1.都是线性结构。

2.插入操作都是限定在表尾进行。

3.都可以通过顺序结构和链式结构实现。、

4.插入与删除的时间复杂度都是O(1),在空间复杂度上两者也一样。

5.多链栈和多链队列的管理模式可以相同。

栈与队列的不同点:

1.删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。

2.应用场景不同;常见栈的应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现,深度优先搜索遍历等;常见的队列的应用场景包括计算机系统中各种资源的管理,消息缓冲器的管理和广度优先搜索遍历等。

3.顺序栈能够实现多栈空间共享,而顺序队列不能。

PHP实现栈和队列:

array_shift : 删除数组中首个元素,并返回被删除元素的值。

array_unshift : 在数组开头插入一个或多个元素。

array_pop:删除数组的最后一个元素(出栈)。

array_push:将一个或多个元素插入数组的末尾(入栈)。


参考资料:
php开发工程师面试题知识点总结(一)
运算符优先级
inRandomOrder
Laravel 返回数据库中的随机一行数据
什么是异或_异或运算及异或运算的作用
c语言a=a^b; b=a^b; a=a^b 是啥意思啊??

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注