面试题答案
一键面试算法设计思路
- 数据结构选择:
- 单纯使用
ArrayList
进行线性查找,时间复杂度为O(n),对于大量数据效率较低。因此,可以考虑构建辅助数据结构来加速查找。 - 可以使用
HashMap
来存储自定义对象,以属性组合作为键,以ArrayList
中对象的索引作为值。这样在查找时,可以通过计算属性组合的哈希值快速定位到目标对象。
- 单纯使用
- 优化策略:
- 减少哈希冲突:为属性组合设计一个高质量的哈希函数,尽量减少不同属性组合产生相同哈希值的情况。可以将每个属性的哈希值进行适当的运算(如异或等)来得到最终的哈希值。
- 批量构建索引:如果需要一次性添加大量对象,可以批量处理来构建哈希表,减少构建过程中的开销。
核心代码实现
假设自定义对象为CustomObject
,有两个属性attr1
和attr2
:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class CustomObject {
private String attr1;
private String attr2;
public CustomObject(String attr1, String attr2) {
this.attr1 = attr1;
this.attr2 = attr2;
}
public String getAttr1() {
return attr1;
}
public String getAttr2() {
return attr2;
}
}
public class CustomObjectSearch {
private List<CustomObject> objectList = new ArrayList<>();
private Map<String, Integer> indexMap = new HashMap<>();
public void addObject(CustomObject object) {
int index = objectList.size();
objectList.add(object);
String key = generateKey(object);
indexMap.put(key, index);
}
private String generateKey(CustomObject object) {
return object.getAttr1() + "|" + object.getAttr2();
}
public CustomObject findObject(String attr1, String attr2) {
String key = attr1 + "|" + attr2;
Integer index = indexMap.get(key);
if (index != null) {
return objectList.get(index);
}
return null;
}
public static void main(String[] args) {
CustomObjectSearch search = new CustomObjectSearch();
search.addObject(new CustomObject("value1", "value2"));
CustomObject result = search.findObject("value1", "value2");
if (result != null) {
System.out.println("Found object: attr1=" + result.getAttr1() + ", attr2=" + result.getAttr2());
} else {
System.out.println("Object not found");
}
}
}
在上述代码中:
CustomObject
类表示自定义对象,包含两个属性attr1
和attr2
。CustomObjectSearch
类包含一个ArrayList
用于存储对象,以及一个HashMap
用于构建索引。addObject
方法在向ArrayList
添加对象的同时,构建哈希表索引。generateKey
方法生成属性组合的键。findObject
方法根据属性组合查找对象,如果找到则返回对象,否则返回null
。