前言
map的key使用起来还很简单,但是value要存什么,就需要对题有一定的理解和问题转换,有时不是死板的存一个set进去,或许存一个变量就替代了set,此时说明set中前面存的所有对题解都没关系,可以抽象舍弃。
一、保证文件名唯一
二、map计数
map存,该字符串的next,如果发生冲突,需要不断寻找next
func getFolderNames(names []string) []string {
record := map[string]int{}
ans := make([]string,len(names))
for i,name := range names {
if next,ok := record[name];ok {
newName := getNewName(name,next)
// 判定截止当前,最小合法的next为多少。
for record[newName] != 0 {
next++
newName = getNewName(name,next)
}
// bug1:考虑的不够严谨,逻辑不够严谨,不够专心!!!
// 把这个位置占了,得record,警示后来的字符串。
record[newName] = 1
record[name] = next + 1
ans[i] = newName
}else {
record[name] = 1
ans[i] = name
}
}
return ans
}
func getNewName(name string,next int) string {
sb := strings.Builder{}
sb.WriteString(name)
sb.WriteByte('(')
sb.WriteString(strconv.Itoa(next))
sb.WriteByte(')')
return sb.String()
}
// map存,该字符串的next,如果发生冲突,需要不断寻找next
总结
1)做题还是有点不专心,考虑的不够严谨,思考逻辑不够严谨!比如每次向ans里面复制时,都说明了有个字符串被占了,需要设置record[newName] = 1,已警示后来的字符串。
2)涉及到大量字符串拼接,还是使用strings.Builder比较友好。
参考资料
[1] LeetCode 保证文件名唯一