阿里電話面試-解決兩個衝突的事項,阿里面試

來源:互聯網
上載者:User

阿里電話面試-解決兩個衝突的事項,阿里面試

    情形:甲和乙有些代辦事項,每一個事項都有一個開始時間,和一個截止時間。但是甲和乙的代辦事項可能會出現衝突,若在一個代碼事項中,存在其他代辦事項,則就認為是衝突。現要求合并甲和乙的代辦事項,不能夠有衝突。

  解決:

   由於我經常用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;}
   其實仔細分析,這在邏輯上並不是太難。對於我一個很久沒寫過演算法的人來說,當面試是時,沒有寫出來,悲劇,一面就被拒絕了,看來找工作前,一定要多寫點代碼,多複習資料結構啊。

   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.