题解 | #简单错误记录#

简单错误记录

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)
}
}

全部评论

相关推荐

03-04 07:14
门头沟学院 C++
黑皮白袜臭脚体育生:老板:都给工作机会了还想要工资,哪来这么多好事
点赞 评论 收藏
分享
UtopianYou...:这个简历排版真的不太行哦,去找免费的或者花点小钱,把排版弄整齐一点吧,看着舒服。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务