头条外包面试

Posted by hdj on April 30, 2020

前言

01算法题。

1 给定一个无序的数组,找出数组在排序之后,相邻元素之间的最打差值。如果数组元素个数小于2,则返回0

算法题 01

题解

``

   function findMax(arr){
      if(arr.length < 2){
        return 0
      }
      arr.sort() // 排序 每个浏览器的sort方法不同,chrome默认的是快排+插入,相对较快
      let result = 0
      for(let i = 1;i<arr.length;i++){
         let differ = arr[i] - arr[i-1]
         if(differ > result){
           result = differ
         }
     
      }
      return result
   
   }

`` 复杂度: O(NlogN + N)

2 给定两个数组,编写一个函数来计算他们的交集,且输出值唯一

算法题 02

题解

leetcode 349. 两个数组的交集

  `` 
   var intersection = function(nums1, nums2) {
      let res = []
     let s1 = new Set(nums1)
     let s2 = new Set(nums2)
     s1.forEach(item => {
       if (s2.has(item)) {
         res.push(item)
       }
     })
     return res
   
   };
   
   ``
  
   
   ```
      var intersection = function(nums1, nums2) {
         let l1 = nums1.length
         let l2 = nums2.length
         let minArr = nums1
         let maxArr = nums2
         if(l1>l2){
             minArr = nums2
             maxArr = nums1
             l1 = minArr.length
             l2 = maxArr.length
         }
         let obj = Object.create(null)
      
          minArr.forEach(item=>{
              obj[item] = true
          }) 
          let result = []
      
          maxArr.forEach(item=>{
              if(obj[item]){
                  result.push(item)
                  obj[item] = false
              }
          })
          return result
      
       };
       
   ```
3 输入一个正数n,输出所有和为n连续正数序列
 ![算法题 03](http://hdj2048228.github.io/img/2020-04/03.jpg)

面试题57 - II. 和为s的连续正数序列

    var findContinuousSequence = function(target) {
          let res = [];
            let i = 1; // i 代表起始位置
            let j = 1; // j 代表加到的位置
            let sum = 0; // 和
            while (i <= target/2) { 
                 // 大于一半的时候,往后加没意义了,因为,如10的一半5,数到5再去加6肯定大于10
                if (sum < target) sum += j++; // 小于target的时候继续 +
                else if (sum > target) sum -= i++; 
                // 大于target的时候sum -起始位置的值,且i++ 则代表起始位置+1省去了计算i+1 到j的值
                else
                {
                    let temp = new Array(j-i);
                    for (let k = i; k < j; k++)
                    {
                        temp[k-i] = k;
                    }
                    res.push(temp);
                    sum -= i++;
                    sum += j++;
                }
            }
       
       return res
    };

4 设计一个promise实例随机生成一个值n,三秒后输出,n小于0.5使用then,其他使用异常

  let p = new Promise((resolve,reject)=>{
    let n = Math.random() // 生成的值是 (0,1]
    setTimeout(()=>{
      n >= 0.5? reject(n):reslove(n)
    
    },3000)
  })
  p.then((n)=>{
     console.info(n)
  
   }).catch((n)=>{
       console.error(n)
  })

5. 搜索高亮

使用v-html

<ul >
  <li v-for="item in data" :key="item" v-html="searchFn(item,searchText)"></li>
</ul>  
   
   
   data:['abc', 'ab' ,'123ad']
   searchText: 'ab'
   
   searchFn(item,searchText){
       const rp =  `<span style="color: yellow">${searchText} <span>`
       const re = new RegExp(searchText, 'g');
      return item.replace(re,rp)
  
   }

6.设计进度条

进度条

 ``
     <div style="postion:realtive;height:16px;border-radius: 8px;background: gray;">
       <div style="color:white;text-align:right;postion:absloute;top: 0px;left: 0px;bottom: 0px; border-radius:8px;" 
       :style="{ width: width +'%'}">
               %
       </div>
     </div>
                                                
    data(){
      return{
        width: 70
      } 
    }
``