这两道都比较简单,就一起写了吧。
存在重复元素
题目描述:
给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
思路:
思路1:遍历,用map存,后面不断从map中找。时间复杂度O(n),空间复杂度O(n)
思路2:排序然后扫描。时间复杂度O(nlogn),空间复杂度O(1)
代码:
// 思路1
public boolean containsDuplicate(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int num : nums) {
if (!set.contains(num)) {
set.add(num);
} else {
return true;
}
}
return false;
}
// 思路2
public boolean containsDuplicate1(int[] nums) {
if (nums == null || nums.length == 0) {
return true;
}
Arrays.sort(nums);
for (int i = 0; i < nums.length - 1; i++) {
if (nums[i] == nums[i + 1]) {
return true;
}
}
return false;
}
然后是第二题
只出现一次的数字
题目描述:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
思路:
自己只想到的思路1和2,虽然看到了题目标签是位运算,但没有想到异或这里。后面看了评论,豁然开朗
思路1:用map,遍历存
思路2:排序,然后遍历
思路3:位运算,一直异或。
代码:
// 思路2
public int singleNumber(int[] nums) {
Arrays.sort(nums);
for (int i = 0; i < nums.length - 1; i++) {
if (nums[i] != nums[i + 1]) {
return nums[i];
}
i += 1;
}
return nums[nums.length - 1];
}
// 思路3
public int singleNumber2(int[] nums) {
return Arrays.stream(nums).reduce(0, (a, b) -> a ^ b);
}