1. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
java答案:
1. 排序
class Solution {
public int singleNumber(int[] nums) {
Arrays.sort(nums);
for(int i=0;i<nums.length-1;i++){
if(nums[i] == nums[i+1]){
i=i+1;
}else{
return nums[i];
}
}
return nums[nums.length-1];
}
}
时间复杂度o(nlogn)
2. HashMap方法
class Solution {
public int singleNumber(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (Integer i : nums) {
Integer count = map.get(i);
count = count == null ? 1 : ++count;
map.put(i, count);
}
for (Integer i : map.keySet()) {
Integer count = map.get(i);
if (count == 1) {
return i;
}
}
return -1; //没有找到
}
}
时间复杂度是o(n),空间复杂度是o(n)
3. 异或方法:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
class Solution {
public int singleNumber(int[] nums) {
int ans = nums[0];
if (nums.length > 1) {
for (int i = 1; i < nums.length; i++) {
ans = ans ^ nums[i];
}
}
return ans;
}
}
时间复杂度是o(n),空间复杂度是o(1)
注意:
HashMap的方法:
创建对象:Map<Integer, Integer> map = new HashMap<>();
V put(K key, V value) :以键=值的方式存入Map集合
V get(Object key) :根据键获取值
int size():返回Map中键值对的个数
boolean containsKey(Object key) :判断Map集合中是否包含键为key的键值对
boolean containsValue(Object value) :判断Map集合中是否包含值为value键值对
遍历:
Set keys = map.keySet();
for(String key:keys){
String value = map.get(key);
System.out.println(key+"-----"+value);
}
JavaScript答案:
1. 排序
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
nums.sort();
for(var i=0;i<nums.length-1;i++){
if(nums[i]==nums[i+1]){
i=i+1;
}else{
return nums[i];
}
}
return nums[nums.length-1];
};
2. 异或
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
var ans = nums[0];
for(var i=1;i<nums.length;i++){
ans = ans^nums[i];
}
return ans;
};
2. 求众数
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
java答案:
1. 双重for循环:时间复杂度是o(n^2),空间复杂度是o(1)
2. 排序后,中间的一定是众数
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}
}
时间复杂度是o(nlgn),空间复杂度是o(1)或o(n),将 nums 就地排序,如果不能就地排序,我们必须使用线性空间将 nums 数组拷贝,然后再排序。
3. hashMap
class Solution {