zoukankan      html  css  js  c++  java
  • 面试遇到的题目及解决办法

    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     }
  • 相关阅读:
    【IDEA】IDEA自定义注解无法自动识别入参和出参
    vue脚手架安装成功,但依然提示'vue' 不是内部或外部命令,也不是可运行的程序 或批处理文件。解决方案
    小程序怎么将input宽输入字母全部转大写字母
    微信小程序van-popup左右弹窗无法显示白色背景
    vscode中实现滚轮缩放代码
    element-ui监听el-dialog关闭事件
    测试人必看的5本好书,没看过你就吃亏啦~
    解决Access在Windows7下数据源的配置问题(32位)
    微软Win10补丁KB5005565更新后打印机连接不上(0x0000011b)
    Windows设置共享文件夹无法访问问题
  • 原文地址:https://www.cnblogs.com/sunniest/p/4402197.html
Copyright © 2011-2022 走看看