阿里电话面试-解决两个冲突的事项

来源:互联网 发布:新网域名管理密码忘记 编辑:程序博客网 时间:2024/06/05 18:20

情形:甲和乙有些代办事项,每一个事项都有一个开始时间,和一个截止时间。但是甲和乙的代办事项可能会出现冲突,若在一个代码事项中,存在其他代办事项,则就认为是冲突。现要求合并甲和乙的代办事项,不能够有冲突。

  解决:

   由于我经常用java,所以就用java模拟该问题。

   定义代办事项:   

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class Node  
  2. {  
  3.     private int startTime;  
  4.     private int endTime;  
  5.     Node cNode;  
  6. }  
   甲和乙的代办事项已经是有序的链表

   初始化甲的代办事项:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. Node nodeA = new Node(12);// 初始化节点A  
  2. nodeA.addNode(new Node(26));  
  3. nodeA.addNode(new Node(37));  
  4. nodeA.addNode(new Node(49));  
  5. nodeA.addNode(new Node(712));  
  6. nodeA.addNode(new Node(1619));  

   初始化乙的代办事项:

   

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. Node nodeB = new Node(24);  
  2. nodeB.addNode(new Node(36));  
  3. nodeB.addNode(new Node(710));  
  4. nodeB.addNode(new Node(915));  
  5. nodeB.addNode(new Node(1820));  
   注意:甲乙各自的代办事项中都可能存在冲突,合并后的代办事项也可能存在冲突。

   基于此的话,我们考虑直接将甲和乙的代办事项合并,然后再将合并后的代办事项中冲突的事项给删除掉。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. printNode(nodeA);  
  2. printNode(nodeB);  
  3. Node mergeNode=mergeWithNoSort(nodeA, nodeB);//将两个节点合并  
  4. printNode(mergeNode);  
  5. Node deleteNode=deleteNode(mergeNode);//删除节点中冲突的节点  
  6. printNode(deleteNode);  
运行结果如图:

 
    将两个节点合并函数:

        

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public static Node mergeWithNoSort(Node nodeA, Node nodeB)  
  2. {  
  3.     Node tempNode = nodeA;  
  4.     // 合并nodeA 和nodeB  
  5.     // 采用插入删除,将nodeB插入到nodeA中  
  6.     Node insertNode = nodeB;  
  7.         while (tempNode != null)  
  8.         {  
  9.             if (tempNode.cNode == null)  
  10.             {  
  11.                 if (insertNode.startTime <= tempNode.startTime)  
  12.                 {  
  13.                     Node tempInsert = insertNode;  
  14.                     insertNode.cNode = tempNode;  
  15.                     tempNode = insertNode;  
  16.                     insertNode = tempInsert;  
  17.                     break;  
  18.                 }  
  19.                 else  
  20.                 {  
  21.                     tempNode.cNode = insertNode;  
  22.                     return nodeA;  
  23.                 }  
  24.             }  
  25.             else  
  26.             {  
  27.                 if (insertNode.startTime <= tempNode.startTime)  
  28.                 {  
  29.                     Node tempInsert = insertNode;  
  30.                     insertNode.cNode = tempNode;  
  31.                     tempNode = insertNode;  
  32.                     insertNode=tempInsert;  
  33.                     break;  
  34.                 }  
  35.                 else if (insertNode.startTime>tempNode.startTime&&insertNode.startTime<=tempNode.cNode.startTime)  
  36.                 {  
  37.                                                Node tempInsert=insertNode.cNode;  
  38.                                                insertNode.cNode=tempNode.cNode;  
  39.                                               tempNode.cNode=insertNode;//巧妙利用nodeB已经是有序,少写外面一个循环  
  40.                                               insertNode=tempInsert;  
  41.                 }  
  42.                 else {  
  43.                     tempNode=tempNode.cNode;  
  44.                 }  
  45.             }  
  46.         }  
  47.     return nodeA;  
  48. }  

     删除重复节点的函数:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. // 删除有冲突的节点  
  2. public static Node deleteNode(Node node)  
  3. {  
  4.     Node tempNode = node;  
  5.     while (tempNode!=null&&tempNode.cNode != null)  
  6.     {  
  7.         if (tempNode.cNode.startTime < tempNode.endTime)// 有冲突,删除节点  
  8.         {  
  9.             Node temp = tempNode.cNode;  
  10.             tempNode.cNode = temp.cNode;  
  11.             continue;  
  12.         }  
  13.         tempNode = tempNode.cNode;  
  14.           
  15.     }  
  16.     return node;  
  17. }  


    打印节点函数:

    

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. // 打印一个节点  
  2. public static void printNode(Node node)  
  3. {  
  4.     Node tempNode = node;  
  5.     while (tempNode != null)  
  6.     {  
  7.         System.out.print("(" + tempNode.startTime + "," + tempNode.endTime  
  8.                 + ")->");  
  9.         tempNode = tempNode.cNode;  
  10.     }  
  11.     System.out.println();  
  12. }  
   在节点的最后一个节点添加一个节点:

    

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. // 向节点后面添加一个节点  
  2. public void addNode(Node node)  
  3. {  
  4.     Node tempNode = this;  
  5.     while (tempNode.cNode != null)  
  6.     {  
  7.         tempNode = tempNode.cNode;  
  8.     }  
  9.     tempNode.cNode = node;  
  10. }  
   其实仔细分析,这在逻辑上并不是太难。对于我一个很久没写过算法的人来说,当面试是时,没有写出来,悲剧,一面就被拒绝了,看来找工作前,一定要多写点代码,多复习数据结构啊。
0 0
原创粉丝点击