多少人可以在一小时内做出来,面试题插入排序单链表

2019-06-10 20:16:05 +08:00
 greenlake
让你用你熟悉的语言写一个插入排序单链表的算法题,你可以在一小时内写出来吗,并配上单元测试,同时编译通过
6161 次点击
所在节点    程序员
44 条回复
zchlwj
2019-06-11 08:30:08 +08:00
easy 难度。多做做 leetcode
TomVista
2019-06-11 08:49:16 +08:00
2 本毕业一年,得重新学.
petelin
2019-06-11 09:04:23 +08:00
应该只能用冒泡排序吧
BBCCBB
2019-06-11 09:12:28 +08:00
这个用归并排序, leetcode 就有.插入排序也简单..
shilyx
2019-06-11 09:30:41 +08:00
半小时
shilyx
2019-06-11 09:35:16 +08:00
misaka19000
2019-06-11 09:43:46 +08:00
这个算是非常基础的题目了吧,感觉应该要不了一个小时就够了
hand515
2019-06-11 09:44:31 +08:00
用 python 的话,就 10 分钟吧
misaka19000
2019-06-11 09:45:35 +08:00
@xuanbg #7 写的话应该基本上都写过吧,不过在生产环境肯定是不会用自己实现的链表的
cjh1095358798
2019-06-11 10:03:39 +08:00
三点:1.快速指针找到中点 2.归并 3,合并两条有序链表
Caballarii
2019-06-11 10:04:03 +08:00
一个小时,即使你完全没接触过快速排序,拿到算法也应该能自己实现出来了
tt67wq
2019-06-11 10:06:03 +08:00
如果插入的话,没啥难度,归并难点
jorneyr
2019-06-11 10:14:21 +08:00
链表使用一个空的头结点可以简化插入删除操作

插入排序时转变一下思路即可:
数组的插入:前面都是有序的
链表的插入:后面都是有序的
xiadong1994
2019-06-11 10:19:38 +08:00
@cjh1095358798 那是归并排序……
whusnoopy
2019-06-11 10:23:01 +08:00
这种题在 BAT 这个级别的公司里,应该是技术面第一轮暖身题的难度,最低期望应该是 20 分钟内解决。依次对比可以估算下应该多少人会写

P.S. 当年毕业时某一轮现场面在纸上写了一个完整的 AVL 平衡二叉树,写了 4 页 A4 纸,还跟面试官逐步去纸上调试了一遍,包括各种边界情况
pwrliang
2019-06-11 11:41:27 +08:00
@greenlake 一到公司就迫不及待,花了有半小时吧,写出来了。包含一个编码、测试,用了 Idea 做调试,直接白板写估计够呛。

-------------------
```
import java.util.*;

class Solution {
class Node {
Node next;
int val;

Node() {

}

Node(int val) {
this.val = val;
}

@Override
public String toString() {
return val + (next != null ? "->" + next.toString() : "");
}
}

boolean check(Node head) {
Node p = head.next;

while (p.next != null) {
if (p.val > p.next.val) {
return false;
}
p = p.next;
}

return true;
}

Node asNode(int[] array) {
Node head = new Node();
Node p = head;

for (int e : array) {
p.next = new Node(e);
p = p.next;
}

return head;
}

void sort(Node head) {
if (head == null || head.next == null)
return;

Node prev = head;
Node curr = prev.next;

while (prev.next != null) {
Node p = head;
boolean changed = false;
while (p != curr) {
if (p == head && curr.val < p.next.val || curr.val >= p.val && curr.val < p.next.val) {
prev.next = curr.next;
Node tmp = p.next;
p.next = curr;
curr.next = tmp;
changed = true;
break;
}
p = p.next;
}

if (changed) {
curr = prev.next;
} else {
prev = prev.next;
curr = prev.next;
}
}
}
}


测试:

Solution solution = new Solution();
{
Solution.Node head = solution.asNode(new int[]{5, 1, 5, 3, 4, 2});
solution.sort(head);
assert solution.check(head);
}

{
Solution.Node head = solution.asNode(new int[]{1});
solution.sort(head);
assert solution.check(head);
}

for (int times = 0; times < 1000; times++) {
int len = 2000;
int[] test = new int[len];
Random random = new Random();
for (int i = 0; i < len; i++)
test[i] = random.nextInt();

Solution.Node head = solution.asNode(test);
solution.sort(head);
assert solution.check(head);
}

```
layorlayor
2019-06-11 13:01:12 +08:00
这个不就是链表的遍历+节点插入吗
jmc891205
2019-06-11 13:20:31 +08:00
工作中经常用链表的表示无压力
fredshao
2019-06-11 13:26:07 +08:00
啥叫插入排序链表?是必须用插入排序,去排一个链表?
Tangdixi
2019-06-11 13:27:19 +08:00
@whusnoopy 很凶残,但还是没有手写红黑树凶残哈哈哈哈哈哈哈,旋转真的要写到蛋碎

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/572589

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX