题目描述
1. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
题目来源
2. 缺失数字
给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。
示例 1:
输入: [3,0,1]
输出: 2
示例 2:
输入: [9,6,4,2,3,5,7,0,1]
输出: 8
说明:
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?
题目来源
3. 找不同
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例:
输入:
s = “abcd”
t = “abcde”
输出:
e
解释:
‘e’ 是那个被添加的字母。
题目来源
代码展示
1. 只出现一次的数字
只出现一次的数字的题型这里使用异或的方法解决,同样地,如果问 出现 奇数次的一个数字(其他数字都出现偶数次) 也可用同样的方法。或者采用哈希表的方式,请读者思考哈希表的求解过程。之后会更新关于哈希表的相关解法。
class Solution {
public int singleNumber(int[] nums) {
int result=0;
for(int i=0;i<nums.length;i++){
result=nums[i]^result;
}
return result;
}
}
2. 缺失数字
这里列举了三种常见的方法,而且这三种方法相对其他方法较为高效。方法一和方法三原理相同,只是计算过程不同。而方法二是采用异或的方法,这样可以提高程序运行的效率。并且其他两个题目也可以仿照这三种方法进行求解。
class Solution {
public int missingNumber(int[] nums) {
int result=0;
for(int i=0;i<nums.length;i++){
result=result-nums[i]+i;
}
result=result+nums.length;
return result;
}
}
class Solution {
public int missingNumber(int[] nums) {
int result=0;
for(int i=0;i<nums.length;i++){
result=result^nums[i]^i;
}
result=result^nums.length;
return result;
}
}
class Solution {
public int missingNumber(int[] nums) {
int sum = 0;
for(int i = 0; i < nums.length; i++){
sum += nums[i];
}
return nums.length * (nums.length + 1) / 2 - sum;
}
}
3. 找不同
class Solution {
public char findTheDifference(String s, String t) {
int result=0;
for(int i=0;i<s.length();i++){
result=result^s.charAt(i)^t.charAt(i);
}
result=result^t.charAt(t.length()-1);
return (char)result;
}
}
由于异或运算属于二进制的底层机器运算,所以其效率比一般的计算过程要高,这类题目有人采用排序等直接的方法,这样提高了时间复杂度;或者重新创建一个新的数组,这样提高了空间复杂度。