题目

最短摘要生成
给定一个字符串,以及一系列查询词,在这个字符串中找到一个子串,该子串包含全部的查询词,求这个最短子串

解析

两个指针,begin和end
首先使用end往右边移动一直移动到全部包含查询字符集q的位置
然后将begin也向右边移动,直达再移动一次begin-end区间里面的数据将不再包含q
此时记录begin和end以及其最小的间距
然后begin右移一位,end继续右边移动直至全部包含,周而复始

Read More

题目

对于一个由N个整数组成的数组,需要比较多少次才能把最大和最小的数找出来呢?

解析

普通的遍历是需要O(2n)时间,那有没有其他更好的办法呢?
其实可以使用分而治之的思想,将N分为两段 分别取到每一段中的最大和最小值 ,然后最大与最大比即可 最小与最小比即可,这样就可以避免最小与最大的比较

比如:
1,2,3,4
正常对比的话得到min=1,max=4需要6次
那如果先求的min1=1,max1=2,min2=3,max2=4(需要2次比较)
然后min1<min2 得到min=1,max1<max2可得max=4 (又是需要2次)
所以这种方法只需要4

Read More

全排列

这里主要使用递归来实现,也就是考察递归的熟练使用与否

全排列的递归生成规则为:

  1. n个数的全排列=(其中一个数的前缀)+n-1个树的全排列
  2. 当前只剩下一个待选前缀的时候,停止迭代
  3. 关于前缀的设立,是逐个迭代剩余的候选元素通过两两交换完成的,在进行输出之后还需要还得将两个数字重新交换回去

Read More

AOP介绍

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
--摘自百度百科

通过这个介绍还不是很理解怎么办?什么是切面呀?

我的理解哈:你现在有一系列普通的执行方法,但是想在方法执行的前后加点东西,比如记录日志,那你不可能去再每个方法上都去加记录日志的语句,那这个时候AOP就来了,将这个记录日志作为切面切入到这些方法中,在平常自然调用这些方法时候同时执行这些切面。

那该怎么切入呢?

Read More

介绍

队列和栈是编程中非常经典并且使用的两个数据结构:

  • 队列:先入先出
  • 栈:先入后出

队列和栈的互操作主要考察对两个数据结构的认识

使用两个队列实现栈

假设现有队列q1和q2,要通过q1,q2来构建数据的先入后出
栈每次pop的都是最后一次push的值,所以可以在pop的时候将原有值都压入另一个队列,
直到最后一个元素时直接弹出
所以这样的话在push的时候就必须将元素进队到有值的那个队列,大致的逻辑图就是这样:

Read More

题目

函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先 后顺序,函数返回串中字符'*'的数量。如原始串为:ab**cd**e*12,处理后为*****abcde12, 函数并返回值为 5。(要求使用尽量少的时间和辅助空间)

解析1

之前做过奇数偶数分离可能很快就想到使用快排分区的思想来解此题了:

Read More

题目

怎样编写一个程序,把一个有序整数数组放到二叉树中?

解析

这里都说这个数组是有序了,想想二叉树中对应有序相关的,就是二叉搜索树了。
二叉搜索树的根节点大于左侧的值,同时又小于右侧的值,那这样正好取数组的中间值作为根节点
然后将两侧分别递归作为左右子节点即可。
这种方式建树的另一个好处就是将树还原成数组很方便:直接使用中序遍历或者用不开辟空间的方法

Read More

题目

a~z 包括大小写与 0~9 组成的 N 个数, 用最快的方式把其中重复的元素挑出来。

解析

本题中已经限制了可能出现字符,他们对应的ascii为

  • a-z:97~122,
  • A-Z:65-90
  • 0-9:48~57

所以这里只需要用位图法来存储,并且之用128位即可,就是4个长度的int数组,
在操作过程中,如果数组中已经设置了值,则说明当前遍历的为重复,打印出来即可
否则,将这个值设置到数组中,整体思路与位排序大致一致,复杂度为O(n)

Read More

find命令极为好使,在面试中也常常会被问到,所以在这里再好好学习一下^_^
注:本文使用的环境是CentOS6.5

Find介绍

功能:在目录结构中搜索文件,并执行指定的操作。此命令提供了相当多的查找条件,功能很强大。 
语法:find 起始目录 寻找条件 操作 
说明:find命令从指定的起始目录开始,递归地搜索其各个子目录,查找满足寻找条件的文件并对之采取相关的操作。 

其实关于Linux下的命令一般通过—help就可以大致入门使用,实在不行再用man来看更为完整版的手册。
下面先长长得列一下:

Read More