目录
LeetCode 268. 0-n中缺失的一个数字 (Easy)
LeetCode 268变形:1-n中重复出现的一个数字 (重复出现2次) (Easy)
LeetCode 287. 1-n中重复出现的一个数字 (可能重复多次)
LeetCode 136. 只出现一次的数字 (其他数均出现2次)
LeetCode 137. 只出现一次的数字II (其他数均出现3次)
LeetCode 260. 只出现一次的数字III (有2个数只出现一次)
LeetCode 387/剑指 35. 第一个只出现一次的字符 (Easy)
LeetCode 41. 缺失的第一个正数
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
要求时间O(n),空间O(1)。
输入: [1,2,0] 输出: 3
输入: [3,4,-1,1] 输出: 2
输入: [7,8,9,11,12] 输出: 1
LeetCode 268. 0-n中缺失的一个数字 (Easy)
给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。
要求时间O(n),空间O(1)。
输入: [3,0,1] 输出: 2
输入: [9,6,4,2,3,5,7,0,1] 输出: 8
思路:
方法一:求和。n(n+1)/2 - sum(nums)即为缺失的那个数。该方法最简单,但可能会溢出。
方法二:位运算。这n个数和 0~n 组成2n+1个数,其中每个数值都出现了2次,只有一个数只出现了1次,即缺失的那个数。
LeetCode 268变形:1-n中重复出现的一个数字 (重复出现2次) (Easy)
给定一个范围在[1, n] 的 n+1 个数的序列,只有一个数出现了两次,找出这个数。
思路:和上题类似。
方法一:求和。重复的那个数 = sum(nums) - n(n+1)/2。该方法最简单,但可能会溢出。
方法二:位运算。这n+1个数和 1~n 组成2n+1个数,其中每个数值都出现了2次,只有一个数只出现了3次,即要找的那个数。
注意:这题(只重复2次)和下面287题(可能重复多次)不同。
LeetCode 287. 1-n中重复出现的一个数字 (可能重复多次)
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
说明:
不能更改原数组(假设数组是只读的)。
要求时间复杂度小于 O() ,空间O(1)
数组中只有一个重复的数字,但它可能不止重复出现一次。
输入: [1,3,4,2,2] 输出: 2
输入: [3,1,3,4,2] 输出: 3
思路:
方法1:先将数组排序, 然后遍历数组,比较相邻元素即可。时间O(nlgn), 空间O(1)。但该方法改变了原数组,不符合要求。
方法2:哈希表, 时间O(n), 空间O(n)。空间复杂度不