题解 | #简单错误记录#
简单错误记录
https://www.nowcoder.com/practice/2baa6aba39214d6ea91a2e03dff3fbeb
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type ErrorRecord struct {
Name string
Rows string
Count int
}
func main() {
in := bufio.NewScanner(os.Stdin)
dict := make(map[string]int)
arr := make([]ErrorRecord, 0)
for in.Scan() {
text := strings.Split(in.Text(), " ")
path := strings.Split(text[0], "\\")
name := path[len(path)-1]
if len(name) > 16 {
name = name[len(name)-16:]
}
if v, ok := dict[name+text[1]]; ok {
arr[v].Count += 1
} else {
dict[name+text[1]] = len(arr)
arr = append(arr, ErrorRecord{
Name: name,
Rows: text[1],
Count: 1,
})
}
}
if len(arr) > 8 {
arr = arr[len(arr)-8:]
}
for i := range arr {
fmt.Println(arr[i].Name + " " + arr[i].Rows + " " + strconv.Itoa(arr[i].Count))
}
}
错误示例:
下面是一个使用Golang实现的简单错误记录功能小模块:
package main
import (
"bufio"
"fmt"
"os"
"path/filepath"
"strings"
)
type ErrorRecord struct {
FileName string
LineNumber int
Occurrences int
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
recordMap := make(map[string]*ErrorRecord)
recordQueue := []*ErrorRecord{}
for scanner.Scan() {
line := scanner.Text()
fields := strings.Fields(line)
fileName := filepath.Base(fields[0])
lineNumber := fields[1]
key := fmt.Sprintf("%s %s", fileName, lineNumber)
if record, ok := recordMap[key]; ok {
record.Occurrences++
} else {
record := &ErrorRecord{
FileName: fileName,
LineNumber: lineNumber,
Occurrences: 1,
}
recordMap[key] = record
recordQueue = append(recordQueue, record)
}
if len(recordQueue) > 8 {
oldestRecord := recordQueue[0]
oldestRecord.Occurrences--
if oldestRecord.Occurrences == 0 {
delete(recordMap, fmt.Sprintf("%s %s", oldestRecord.FileName, oldestRecord.LineNumber))
}
recordQueue = recordQueue[1:]
}
}
for _, record := range recordQueue {
fmt.Printf("%s %s %d\n", record.FileName[len(record.FileName)-16:], record.LineNumber, record.Occurrences)
}
}
该程序通过维护一个错误记录映射表 recordMap 和一个错误记录队列 recordQueue 来实现功能。首先,它使用 bufio.Scanner 从标准输入逐行读取输入数据。每行数据包含带路径的文件名称和行号,它们通过空格分隔。
然后,程序提取文件名并保留最后有效的16个字符。它生成一个唯一的键,由文件名和行号组成,用于在错误记录映射表中查找已存在的记录。如果找到相同的记录,则增加其出现次数;否则,创建一个新的记录并添加到映射表和队列中。
当错误记录数量超过8条时,程序会移除最旧的记录。如果该记录的出现次数为0,则从映射表中删除它。
最后,程序遍历错误记录队列,并按要求输出文件名(最后16个字符)、代码行数和出现次数。
这个实现能够正确记录错误记录的文件名、行号和出现次数,并根据要求输出最后的8条错误记录。同时,它还解决了文件名长度限制和路径问题。
package main
import ( "bufio" "fmt" "os" "path/filepath" "strconv" "strings" )
type ErrorRecord struct { FileName string LineNumber int Count int }
func main() { scanner := bufio.NewScanner(os.Stdin) recordMap := make(map[string]*ErrorRecord) recordList := make([]*ErrorRecord, 0)
for scanner.Scan() {
line := scanner.Text()
fields := strings.Fields(line)
fileName := filepath.Base(fields[0])
lineNumber, _ := strconv.Atoi(fields[1])
// Get the key for the record map
key := fmt.Sprintf("%s %d", fileName, lineNumber)
// Check if the record already exists
if record, ok := recordMap[key]; ok {
record.Count++
} else {
// Create a new record
record := &ErrorRecord{
FileName: fileName,
LineNumber: lineNumber,
Count: 1,
}
recordMap[key] = record
recordList = append(recordList, record)
}
// Check if the record list exceeds 8
if len(recordList) > 8 {
// Remove the oldest record
oldestRecord := recordList[0]
delete(recordMap, fmt.Sprintf("%s %d", oldestRecord.FileName, oldestRecord.LineNumber))
recordList = recordList[1:]
}
}
// Output the error records
for _, record := range recordList {
fmt.Printf("%s %d %d\n", record.FileName, record.LineNumber, record.Count)
}
}


