# 程序员面试金典（一）

## 2.数组与字符串

### 2.1散列表

public HashMap<Integer, Student> buildMap(Student[] students){
HashMap<Integer, Student> map = new HashMap<>();
for (student s : students) {
map.put(s.getId(),s);
}
return map;
}

### 2.2 ArrayList（动态数组）

ArrayList，即动态数组，是一种按需调整大小的数组，数据访问时间为O（1）。一种典型的实现是在数组存满时扩容，每次扩容时O（n），均摊下来还是O（1）。

public ArrayList<String> merges(String[] words,String[] more){
ArrayList<String> sentence = new ArrayList<>();
for (String w : words) {
}
for (String m : more) {
}
return sentence;
}

### 2.3 StringBuffer

public String mergeStr(String[] string){
StringBuffer sb = new StringBuffer();
for (String str : string) {
sb.append(str);
}
return sb.toString();
}

## 3.链表

### 3.1创建链表

class Node{
Node next = null;
int data;

public Node(int d){
data = d;
}
void appendToTail(int d){
Node end = new Node(d);
Node n = this;
while(n.next != null){
n = n.next;
}
n.next = end;
}
}

### 3.2删除单向链表中的节点

if (n.data == d) {
}
while(n.next ! = null){
if (n.next.data == d) {
n.next = n.next.next;
}
n = n.next;
}
}

## 4.栈和队列

### 4.1实现一个栈

class Stacks{
Node top;
Object pop(){
if (top != null) {
Object item = top.data;
top = top.next;
return item;
}
return null;
}
void push(Object item){
Node t = new Node(item);
t.next = top;
top = t;
}
Object peek(){
}
}

public class Stacks {
static String[] months = {"Jan","Feb","Mar","Apr","May",
"June","Aug","Sep","Oct","Nov","Dec"};

public static void main(String[] args) {
Stack stack = new Stack();
//进栈，先进元素压入栈底，最后的元素在栈顶
for (int i = 0; i < months.length; i++) {
stack.push(months[i]+"");
}
System.out.println("stk = " + stack);

System.out.println("element 5 = " + stack.elementAt(5));
System.out.println("popping elements: ");
//出栈后进先出，栈顶元素最先被输出
while (!stack.empty()) {
System.out.println(stack.pop());
}
}
}

### 4.2实现一个队列

class Queue{
Node first,last;
void enqueue(Object item){
if (first == null) {
last = new Node(item);
first = last;
}else{
last.next = new Node(item);
last = last.next;
}
}
Object dequeue(){
if (first != null) {
Object item = first.data;
first = first.next;
return item;
}
}
}

## 5.树和图

### 5.1需要注意的潜在问题

• 二叉树与二叉查找树
二叉查找树一般会有附加条件：对于任意节点，左子节点小于或等于当前节点，后者又小于所有右子节点。
• 平衡与不平衡
树的平衡有多重方法，平衡一棵树只意味着子树的深度差不会超过一定值，并不表示左子树和右子树的深度完全相同。
• 完满和完整（Full and Complete）
完满和完整树的所有叶节点都在树的底部，所有非叶节点都有两个子节点。完满和完整树必须满足2n1$2^n-1$个节点。

### 5.4单词查找树（trie）

trie树是n层树的一种变体，其中每个节点存储有字符。整棵树的每条路径自上而下表示一个单词。

### 5.5图的遍历

• 深度优先搜索（DFS）
在DFS中，先访问节点r，然后循环访问r的每个相邻节点。在访问r的相邻节点n时，会在访问r的其他相邻节点之前先访问n的所有相邻节点。前序和树遍历的其他形式都是一种DFS，区别是对图实现该算法时，必须先检查该节点是否已访问。否则，可能会死循环。
实现DFS伪代码：
void search(Node root){
if(root == null) return;
visit(root);
root.visited = true;
if(n.visited == false) search(n);
}
}
• 广度优先搜索（BFS）
在搜索r的“孙子节点”之前先访问节点r的所有相邻节点。一般用队列实现的迭代方案最有效。
实现BFS伪代码：
void search(Node root){
Queue queue = new Queue();
root.visited = true;
visit(root);
queue.enqueue(root);//加至队列尾部

while(!queue.isEmpty()){
Node r = queue.dequeue();//从队列头部移除
if(n.visited ==false){
visit(n);
n.visited = true;
queue.enqueue(n);
}
}
}
}

• 本文已收录于以下专栏：

## 程序员面试金典（java版）

1确定字符互异 2原串翻转 3原串翻转 4原串翻转 5基本字符串压缩1.1、确定字符互异 题目描述 请实现一个算法，确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构...
• sinat_29912455
• 2016年06月27日 23:51
• 1379

## 《Cracking the Coding Interview程序员面试金典》----最长合成字符串

• u011292087
• 2017年05月03日 15:43
• 280

## 程序员面试金典--笔记(精华篇)

• wuzhimang
• 2017年02月01日 16:17
• 731

## 《Cracking the Coding Interview程序员面试金典》-----

• yyywww666
• 2017年06月21日 19:02
• 234

## 程序员面试金典--面试32之碰撞的蚂蚁

• hj605635529
• 2017年05月14日 13:14
• 119

## 程序员面试金典(1):确定字符互异(python)

• u013915133
• 2017年08月20日 20:29
• 101

## 《Cracking the Coding Interview程序员面试金典》----字符串变换（字典树）

• u011292087
• 2017年05月03日 10:03
• 315

## 《Cracking the Coding Interview程序员面试金典》----下一个元素（下一个比他大的）

• u011292087
• 2017年05月03日 20:36
• 265

## 程序员面试金典算法题

• sinat_14856243
• 2015年12月06日 16:13
• 3542

## GEEK学习笔记— —程序员面试宝典笔记（五）

• lyh03601
• 2016年04月27日 12:07
• 4475

举报原因： 您举报文章：程序员面试金典（一） 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)