原力扣链接:LCR 120. 寻找文件副本
设备中存有
n
个文件,文件id
记于数组documents
。若文件id
相同,则定义为该文件存在副本。请返回任一存在副本的文件id
。示例 1:
输入:documents = [2, 5, 3, 0, 5, 0] 输出:0 或 5
方法一:哈希表
首先最容易想到的就是哈希表,这里由于还是文本id,所以这里的document的id也不是肆无忌惮的写的,所以哈希表的最大长度为len(documents),当找到哈希表中某个索引的值已经改变过就可以直接返回索引值。
func findRepeatDocument(documents []int) int {
hashTable := make([]int, len(documents))
for _, doc := range documents {
if hashTable[doc] == 1 {
return doc
} else {
hashTable[doc] = 1
}
}
return -1
}
方法二:索引值遍历
由于是索引值,所以一定是一一对应的,思路如下:
从第一个索引开始,如果第一个索引不是0,就找document[document[0]]对应的值进行交换(注意:这里的document[document[0]]如果和document[0]的值相等就可以返回)
交换后如果document[0]等于0就开始判断下一个索引1的值,同理。
func findRepeatDocument(documents []int) int {
length := len(documents)
index := 0
for {
if index == length {
break
}
if documents[index] != index {
if documents[documents[index]] == documents[index] {
return documents[index]
}
temp := documents[documents[index]]
documents[documents[index]] = documents[index]
documents[index] = temp
} else {
index++
}
}
return documents[len(documents)-1]
}