面试遇到的题目及解决办法

1.用js写一个类似Dom的getElementByTagName的函数。

试验了一下,js的childNodes属性有兼容性和准确度的问题,经常会多一些空白标签,所以用深搜的方法根本行不通,没法建树,没法准确获取节点树信息。

所以,想到了正则表达式,只用几行代码即可搞定。

 1             window.onload = function () {
 2             var reg = new RegExp("<span.+/span>", "g");
 3             var element = new Array();
 4             var temp;
 5             while ((temp = reg.exec(document.body.innerHTML)) != null) {
 6                 element.push(temp);
 7             }
 8             while ((temp = element.pop()) != null) {
 9                 alert(temp);
10             }
11         }    

之后,又想到另一种DFS深搜解法

 1      class Program
 2     {
 3         private static XmlElement _root;
 4         public static XmlElement Root
 5         {
 6             get { return _root; }
 7             set { _root = value; }
 8         }
 9 
10         private static List<XmlNode> list = new List<XmlNode>();
11         static void Main(string[] args)
12         {
13             WebClient wc = new WebClient();
14             string htmlStr = wc.DownloadString("http://localhost:30907/test1.html");
15             XmlDocument doc = new XmlDocument();
16             doc.LoadXml(htmlStr);
17             Root = doc.DocumentElement;
18             
19             DFS(Root);
20             foreach (var n in list)
21             {
22                 Console.WriteLine(n.OuterXml);
23             }
24             
25             Console.ReadKey();
26         }
27 
28         private static void DFS(XmlNode parent)
29         {
30             
31             if (!parent.HasChildNodes)
32             {
33                 return;
34             }
35             else if (parent.HasChildNodes)
36             {
37                 for (int j = 0; j < parent.ChildNodes.Count; j++)
38                 {
39                     if (parent.ChildNodes[j].Name == "span")
40                     {
41                         list.Add(parent.ChildNodes[j]);
42                     }
43                     DFS(parent.ChildNodes[j]);
44                 }
45             }
46         }
47

如果用宽搜BFS也可以,时间复杂度都是o(n)

 1     class Program
 2     {
 3         private static List<XmlNode> list = new List<XmlNode>();
 4         private static Queue<XmlNode> queue = new Queue<XmlNode>();
 5         static void Main(string[] args)
 6         {
 7             WebClient wc = new WebClient();
 8             string htmlStr = wc.DownloadString("http://localhost:30907/test1.html");
 9             XmlDocument doc = new XmlDocument();
10             doc.LoadXml(htmlStr);
11             XmlElement root = doc.DocumentElement;
12             BFS(root);
13 
14             foreach (var n in list)
15             {
16                 Console.WriteLine(n.OuterXml);
17             }
18 
19             Console.ReadKey();
20         }
21 
22         public static void BFS(XmlNode parent)
23         {
24             queue.Enqueue(parent);
25             while (queue.Count != 0)
26             {
27                 XmlNode n = queue.Dequeue();
28                 if (n.Name == "span")
29                 {
30                     list.Add(n);
31                 }
32                 for (int i = 0; i < n.ChildNodes.Count; i++)
33                 {
34                     queue.Enqueue(n.ChildNodes[i]);
35                 }
36             }
37         }
38     }

2.用js写一个链表,或者用其他语言。

我比较熟C#所以就用C#写,类似List。

 1     public class Node
 2     {
 3         public int Num{get;set;}
 4         public Node Next{get;set;}
 5     }
 6 
 7     public class MyList
 8     {
 9         public Node Head { get; set; }
10         public int Length { get; set; }
11 
12         public MyList()
13         {
14             Head = new Node();
15             Head.Next = null;
16             Length = 1;
17         }
18 
19         public void Add(int num)
20         {
21             Node n = new Node();
22             n.Num = num;
23             Node node = Head;
24             while (node.Next != null)
25             {
26                 node = node.Next;
27             }
28             node.Next = n;
29             Length++;
30         }
31 
32         public void Delete(int index)
33         {
34             Node n = Head;
35             if (index == 0)
36             {
37                 Head = n.Next;
38             }
39             else if(Length-1==index)
40             {
41                 for (int i = 0; i < index - 1; i++)
42                 {
43                     n = n.Next;
44                 }
45                 n.Next = null;
46             }
47             else
48             {
49                 for (int i = 0; i < index - 1; i++)
50                 {
51                     n = n.Next;
52                 }
53                 n.Next = n.Next.Next;
54             }
55             Length--;
56         }
57 
58         public int this[int index]
59         {
60             get {
61                 Node n = Head;
62                 for (int i = 0; i < index; i++)
63                 {
64                     n = n.Next;
65                 }
66                 return n.Num;
67             }
68             set  {
69                 Node n = Head;
70                 for (int i = 0; i < index; i++)
71                 {
72                     n = n.Next;
73                 }
74                 n.Num = value;
75             }
76         }
77     }

 

你可能感兴趣的:(面试)