2.寻找文件副本

原力扣链接: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]  
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值