Go面试编程题目(五) - Go语言中文社区

Go面试编程题目(五)


原文地址:Go面试编程题目(五)

1、词频统计?

从文件中读取一篇文章,统计词频,按单词出现的频率从大到小进行排序,后写入到文件,实现代码如下:

package main

import (
  "encoding/json"
  "fmt"
  "io/ioutil"
  "log"
  "os"
  "sort"
  "strings"
  "unicode"
)

func getWordFrequency(readFilePath string, writeFilePath string) {
  var fileText string
  var wordFrequencyMap = make(map[string]int)
  //读取文件
  fileData, err := ioutil.ReadFile(readFilePath)
  if err != nil {
    log.Fatal(err)
  }

  fileText = string(fileData)
  //去掉分隔符
  f := func(c rune) bool {
    if !unicode.IsLetter(c) && !unicode.IsNumber(c) {
      return true
    }
    return false
  }

  arr := strings.FieldsFunc(fileText, f)
  //如果字典里有该单词则加1,否则添加入字典赋值为1
  for _, v := range arr {
    if _, ok := wordFrequencyMap[v]; ok {
      wordFrequencyMap[v] = wordFrequencyMap[v] + 1
    } else {
      wordFrequencyMap[v] = 1
    }
  }

  //按照单词出现的频率排序
  type wordFrequencyNum struct {
    Word string
    Num  int
  }

  var lstWordFrequencyNum []wordFrequencyNum
  for k, v := range wordFrequencyMap {
    lstWordFrequencyNum = append(lstWordFrequencyNum, wordFrequencyNum{k, v})
  }

  sort.Slice(lstWordFrequencyNum, func(i, j int) bool {
    return lstWordFrequencyNum[i].Num > lstWordFrequencyNum[j].Num
  })

  fmt.Println("按照单词出现频率由高到低排序", lstWordFrequencyNum)

  //写入文件
  var jsonBytes []byte
  var arrJsonBytes string
  for _, v := range lstWordFrequencyNum {
    jsonBytes, err = json.Marshal(v)
    if err != nil {
      log.Fatal(err)
    }
    arrJsonBytes = arrJsonBytes + string(jsonBytes)
  }

  err = ioutil.WriteFile(writeFilePath, []byte(arrJsonBytes), os.ModePerm)
  if err != nil {
    log.Fatal(err)
  }

}

func main() {
  readFilePath := "D:\tools\workSpace\algorithm-算法\Leecode\read.txt"   //读取的文件路径
  writeFilePath := "D:\tools\workSpace\algorithm-算法\Leecode\write.txt" //写入的文件路径
  getWordFrequency(readFilePath, writeFilePath)
}

写入文件部分也可替换成如下代码:
 

  //写入文件
  var arrJsonBytes string
  arrJsonBytes = arrJsonBytes + "[" + "rn"
  for k, v := range lstWordFrequencyNum {

    arrJsonBytes = arrJsonBytes + "{" + """ + v.Word + """ + ":" + strconv.Itoa(v.Num) + "}"
    if k != len(lstWordFrequencyNum)-1 {
      arrJsonBytes = arrJsonBytes + "," + "rn"
    }
  }
  
  arrJsonBytes = arrJsonBytes + "rn" + "]"
  err = ioutil.WriteFile(writeFilePath, []byte(arrJsonBytes), os.ModePerm)
  if err != nil {
    log.Fatal(err)
  }

2、在无序不重复数组中找出两个元素相加值为100的有多少对?

最简单直观的方法就是穷举法,也就是从数组中任意找两个数,看其和是否为给定值,时间复杂度为O(N^2)。

这里考虑使用hash表法,先定义一个map,开始为空,不存数据,之后遍历数组,判断第一个元素是否有另一半已经在map中,如果有count++,反之将第一个元素存入map,继续遍历第二个元素,判断第二个元素是否有另一半已经在map中,如果有count++,没有的话,把第二个元素存入map,重复操作至遍历结束,结果也出来了,实现代码如下:

package main

import "fmt"

func getSumNum(arr []int, sum int) int {
  tp := make(map[int]int)            //map存数组里的元素,注意,这里map初始为空
  var count int                      //计个数
  for i := 0; i <= len(arr)-1; i++ { //遍历数组
    //判断这个元素的“另一半”是否已经在map里
    if _, ok := tp[sum-arr[i]]; ok { //如果在,就说明数组中有这个元素的“另一半”
      count++
    } else { //如果不在,就把这个元素加入map中
      tp[arr[i]] = i
    }
  }

  return count
}

func main() {
  var brr []int = []int{1, 12, 14, 40, 56, 60, 88, 78, 99}
  var sum int = 100
  fmt.Println(getSumNum(brr, sum))
}

打印结果如下:

至此,本次分享就结束了,后期会慢慢补充。

以上仅为个人观点,不一定准确,能帮到各位那是最好的。

好啦,到这里本文就结束了,喜欢的话就来个三连击吧。

扫码关注公众号,获取更多优质内容。

  

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/luyaran/article/details/121492293
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-11-28 13:59:13
  • 阅读 ( 942 )
  • 分类:面试题

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢