知识点

1. & 和 &&的区别

&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。

&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0)不会增长。

&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。

2. int和Integer的区别

1、Integer是int的包装类,int则是java的一种基本数据类型
2、Integer变量必须实例化后才能使用,而int变量不需要
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4、Integer的默认值是null,int的默认值是0
5、Integer对于-128到127之间的数,会进行缓存,不会新建对象,使用同一个

3. java中关于数组转换成字符串方法

	1、Arrays.toString(char[]);
	2、StringBuffer sb = new StringBuffer();
		for(int i = 1; i < arr.length; i++){ 
			sb.append(c4);
		}
	3、new String(char[])。

4. 解决网络传输中文字符问题

  1. 浏览器到服务器:浏览器中的中文字符以GBK进行编码,以字节流传输到服务器,服务器再以iso-8859-1进行解码,以字符的形式传输给程序因为iso-8859-1 编码集不支持中文字符,所有解码后的字符都是西欧字符,把这些字符传输给程序就产生了乱码;
    针对这个原因,只要把服务器的编码集设置为utf-8即可:
    request.setCharacterEncoding(“utf-8”) ;
    但这种方法只能用于POST请求方式,因为设置只会作用于请求体中的内容,如果是GET请求方式,可用先解码再编码的方式:
    byte[] buffer = request.getParameter(“word”).getBytes(“ISO-8859-1”); //进行编码
    String newStr = new String(buffer,“UTF-8”); //进行解码
  2. 程序中的中文字符原样传输到服务器,服务器要先对中文字符进行编码再传输给浏览器,但因为iso-8859-1编码集不支持中文字符,所以在字符集中查找不到 对应的编码,编码后就变成了问号,传输给了浏览器并显示;
    response.setContentType(“text/html;charset=UTF-8”); //将浏览器编码集设置为UTF-8

5. 排序算法

  1. 插入排序:在有序子序列中从后往前找,直到找到一个key小于等于key的数(每往前找一个,那么就往后挪一个),把key放在这个数后面,这就是key合适的位置(好好想明白),或者可能找完了整个序列也没找到我们要的合适的位置,那就放在该有序子序列的第一个元素的位置(此时有序子序列的所有元素已经后挪)
    - 平均时间复杂度:o(N^2)这是显然的,标准的内外两层循环;
    - 空间复杂度:o(1),因为需要常熟个临时变量
  2. 选择排序:每趟从当前待排序列中选出最小的放在已拍好序列的末尾
    - 平均时间复杂度:o(N^2),嵌套双循环;
    - 空间复杂度:o(1)
  3. 冒泡排序:从当前待排序列第一个开始遍历,指针从第一个开始,如果当前元素大于下一个,那么二者交换,指针往后走,当走到待排序列末尾时,最大的一定被放到了最后(像冒泡泡一样上去了),然后缩小待排子序列(把最后一个从当前待排序序列删去),如此循环直到当前待排子序列只有一个元素。
    - 平均时间复杂度:o(N^2),嵌套双循环;
    - 空间复杂度:o(1)

6. 查找算法

平均查找长度(Average Search Length,ASL):需和指定key进行比较的关键字的个数的期望,称为查找算法在查找成功时的平均查找长度。

  1. 顺序查找:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位。
    - 顺序查找的时间复杂度为O(n)
  2. 二分查找 :
    - 说明:元素必须是有序的,如果是无序的则要先进行排序操作。
    - 基本思想:也称为是折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。
    - 最坏情况下,关键词比较次数为log2(n+1),且期望时间复杂度为O(log2n)
    - 注:折半查找的前提条件是需要有序表顺序存储,对于静态查找表,一次排序后不再变化,折半查找能得到不错的效率。但对于需要频繁执行插入或删除操作的数据集来说,维护有序的排序会带来不小的工作量,那就不建议使用。
  3. 插值查找:
    - 基本思想:基于二分查找算法,将查找点的选择改进为自适应选择,可以提高查找效率。当然,差值查找也属于有序查找。
    - 二分查找中查找点计算如下:mid=(low+high)/2, 即mid=low+1/2*(high-low);
    将查找的点改进为如下:mid=low+(key-a[low])/(a[high]-a[low])*(high-low)。
    - 注:对于表长较大,而关键字分布又比较均匀的查找表来说,插值查找算法的平均性能比折半查找要好的多。反之,数组中如果分布非常不均匀,那么插值查找未必是很合适的选择。
  4. 斐波那契查找:
    - 基本思想:也是二分查找的一种提升算法,通过运用黄金比例的概念在数列中选择查找点进行查找,提高查找效率。同样地,斐波那契查找也属于一种有序查找算法。
    相对于折半查找,一般将待比较的key值与第mid=(low+high)/2位置的元素比较,比较结果分三种情况:
    1)相等,mid位置的元素即为所求
    2)>,low=mid+1;
    3)<,high=mid-1。
  5. 树表查找

7.

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务