阿里電話面試-解決兩個衝突的事項,阿里面試
情形:甲和乙有些代辦事項,每一個事項都有一個開始時間,和一個截止時間。但是甲和乙的代辦事項可能會出現衝突,若在一個代碼事項中,存在其他代辦事項,則就認為是衝突。現要求合并甲和乙的代辦事項,不能夠有衝突。
解決:
由於我經常用java,所以就用java類比該問題。
定義代辦事項:
public class Node{private int startTime;private int endTime;Node cNode;} 甲和乙的代辦事項已經是有序的鏈表
初始化甲的代辦事項:
Node nodeA = new Node(1, 2);// 初始化節點AnodeA.addNode(new Node(2, 6));nodeA.addNode(new Node(3, 7));nodeA.addNode(new Node(4, 9));nodeA.addNode(new Node(7, 12));nodeA.addNode(new Node(16, 19));
初始化乙的代辦事項:
Node nodeB = new Node(2, 4);nodeB.addNode(new Node(3, 6));nodeB.addNode(new Node(7, 10));nodeB.addNode(new Node(9, 15));nodeB.addNode(new Node(18, 20));
注意:甲乙各自的代辦事項中都可能存在衝突,合并後的代辦事項也可能存在衝突。
基於此的話,我們考慮直接將甲和乙的代辦事項合并,然後再將合并後的代辦事項中衝突的事項給刪除掉。
printNode(nodeA);printNode(nodeB);Node mergeNode=mergeWithNoSort(nodeA, nodeB);//將兩個節點合并printNode(mergeNode);Node deleteNode=deleteNode(mergeNode);//刪除節點中衝突的節點printNode(deleteNode);
運行結果
將兩個節點合并函數:
public static Node mergeWithNoSort(Node nodeA, Node nodeB){Node tempNode = nodeA;// 合并nodeA 和nodeB// 採用插入刪除,將nodeB插入到nodeA中Node insertNode = nodeB;while (tempNode != null){if (tempNode.cNode == null){if (insertNode.startTime <= tempNode.startTime){Node tempInsert = insertNode;insertNode.cNode = tempNode;tempNode = insertNode;insertNode = tempInsert;break;}else{tempNode.cNode = insertNode;return nodeA;}}else{if (insertNode.startTime <= tempNode.startTime){Node tempInsert = insertNode;insertNode.cNode = tempNode;tempNode = insertNode;insertNode=tempInsert;break;}else if (insertNode.startTime>tempNode.startTime&&insertNode.startTime<=tempNode.cNode.startTime){ Node tempInsert=insertNode.cNode; insertNode.cNode=tempNode.cNode; tempNode.cNode=insertNode;//巧妙利用nodeB已經是有序,少寫外面一個迴圈 insertNode=tempInsert;}else {tempNode=tempNode.cNode;}}}return nodeA;}
重複資料刪除節點的函數:
// 刪除有衝突的節點public static Node deleteNode(Node node){Node tempNode = node;while (tempNode!=null&&tempNode.cNode != null){if (tempNode.cNode.startTime < tempNode.endTime)// 有衝突,刪除節點{Node temp = tempNode.cNode;tempNode.cNode = temp.cNode;continue;}tempNode = tempNode.cNode;}return node;}
列印節點函數:
// 列印一個節點public static void printNode(Node node){Node tempNode = node;while (tempNode != null){System.out.print("(" + tempNode.startTime + "," + tempNode.endTime+ ")->");tempNode = tempNode.cNode;}System.out.println();} 在節點的最後一個節點添加一個節點:
// 向節點後面添加一個節點public void addNode(Node node){Node tempNode = this;while (tempNode.cNode != null){tempNode = tempNode.cNode;}tempNode.cNode = node;} 其實仔細分析,這在邏輯上並不是太難。對於我一個很久沒寫過演算法的人來說,當面試是時,沒有寫出來,悲劇,一面就被拒絕了,看來找工作前,一定要多寫點代碼,多複習資料結構啊。