模板方法模式是编程中经常用到的模式。它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现。这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤。
策略(strategy)模式属于对象的行为模式。其用途是针对一组算法,将每个不同算法封装到具有共同接口的独立类中,从而使他们可以相互替换。即使 算法和对象分开来,使得算法可以独立于使用它的客户而变化。
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。
示例 1:
12
输入: nums = [1,2,3,1], k = 3输出: true
示例 2:
输入: nums = [1,0,1,1], k = 1输出: true
示例 3:
输入: nums = [1,2,3,1,2,3], k = 2输出: false
将一个请求封装为对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。也称为:动作(Action)模式、事务(transaction)模式。
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL
进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
用一个中介对象封装一系列对象的交互,中介者是多个对象不需要显示的相互作用,而且可以独立的改变他们的交互。
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
“迭代”这个词并不会陌生,我们经常使用Iterator接口对Collection下的集合类进行遍历,常见代码:
1234
Iterator iterator=list.iterator();while(iterator.hasNext()){//进行遍历}
这便是很好的迭代器模式应用例子。我们可以在不暴露集合类的内部结构情况下,通过迭代器让外部客户端透明的访问其内部的数据。