面试题答案

一、算法实现

第一题

1.

package main

import "fmt"

func main() {
   arr := []int{1,2,3,4,5,6,7,8,9,10,11}
   s1 := binarySearch_1(arr,0,len(arr),11)
   s2 := binarySearch_2(arr,1)
   fmt.Println(s1,s2)
}
// 递归
//时间复杂度:O(log2 N)空间复杂度:O(log2N )
func binarySearch_1( arr []int, start int , end int, aim int) int {
   mid := (start + end) / 2
   if start >= mid && arr[start] != aim{
      return -1
   }
   if arr[mid] == aim{
      return mid
   } else if arr[mid] > aim{
      return binarySearch_1(arr, start, mid -1,aim)
   } else if arr[mid] < aim{
      return binarySearch_1(arr, mid+1, end, aim)
   }
   return -1
}

// 非递归
//时间复杂度:O(log2 N)空间复杂度:O(1)
func binarySearch_2(arr []int, aim int) int{
   start, end := 0 , len(arr)
   for {
      fmt.Println(start, end)
      mid := (start+end) / 2
      if start >= end{
         return -1
      }
      if arr[mid] == aim{
         return mid
      }else if arr[mid] > aim{
         end = mid
      }else if arr[mid]< aim{
         start = mid
      }
   }
}

 第二题

1.链表节点结构

type Node struct {
   Next *Node
}
//传入链表头,返回-1则不存在节点,返回其他值则存在节点,且节点位置为返回的数值
func Linkcycle_2(head *Node) int {
   temp, cur := head, head
   i := 0
   for {
      if cur.Next == nil{
         return -1
      }
      for {
         if temp == cur && cur.Next == temp || temp == cur.Next{
            return i + 1
         }else if temp == cur {
            i = 0
            temp = head
            break
         }else {
            i++
            temp = temp.Next
         }
      }
      cur = cur.Next
   }
}

 

第二题  应用开发

1.

package main

import (
   "fmt"
   "io/ioutil"
   "net/http"
   "os"
   "regexp"
   "strings"
   "sync"
)
var re = regexp.MustCompile(`.*?`)
var Urllist = [10]string{
   "https://news.sina.com.cn/c/2019-09-22/doc-iicezzrq7553985.shtml",
   "https://news.sina.com.cn/c/2019-09-23/doc-iicezueu7812094.shtml",
}

func main() {
   //runtime.GOMAXPROCS(runtime.NumCPU())
   wg := sync.WaitGroup{}

   for i := 0;i < 10; i++{
      url := Urllist[i]
      if strings.TrimSpace(url) != ""{
         wg.Add(1)
         go Geturl(url,&wg)
      }
   }
   wg.Wait()
}

func Geturl(url string,wg *sync.WaitGroup){
   defer func(){wg.Done()}()
   resp,err := http.Get(url)
   if err != nil {
      fmt.Println("爬取失败")
   }
   content, _ := ioutil.ReadAll(resp.Body)
   title := strings.Split(strings.Split(re.FindString(string(content)),"")[1],"")[0]
   fmt.Println(title)
   path := "./" + title
   f, err := os.Create(path) //传递文件路径
   defer func(){
      f.Close()
   }()
   if err != nil {           //有错误
      fmt.Println("err = ", err)
      return
   }
   f.Write(content)
}

 

第二题 mysql

1.建立索引时,可以将status和author_id建立联合索引,update_id数据量较大,而且有可能实时更新,不适合建立索引。

查询语句如果在没有必要的情况下,可以列出要查询的字段,不要用*查询所有。将查询的条件进行调整,将update_at字段的条件放到最前面。

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