51.数组中数字出现的次数 II
题目:
在一个数组 nums
中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
题解:
- 遍历出现的次数存入map,遍历map取出key值。
public int singleNumber(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums){
map.put(num, map.getOrDefault(num, 0) + 1);
}
Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<Integer, Integer> entry = iterator.next();
if (entry.getValue() == 1)
return entry.getKey();
}
return 0;
}
- 推荐使用foreach遍历map。
for (Map.Entry<Integer, Integer> entry : map.entrySet()){
if (entry.getValue() == 1)
return entry.getKey();
}
52.数组中出现次数超过一半的数字
题目:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
题解:
- 遍历出现的次数存入map,遍历map取出key值。
public int majorityElement(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums){
map.put(num, map.getOrDefault(num, 0) + 1);
}
for (Map.Entry<Integer, Integer> entry :map.entrySet()){
if (entry.getValue() > nums.length/2){
return entry.getKey();
}
}
return 0;
}
53.构建乘积数组
题目:
给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。
题解:
- 先计算左下角的累乘结果,存入res数组中;
- 再计算右上角的累乘,与此前res数组中的对应元素相乘,返回最后的结果。
public int[] constructArr(int[] a) {
int length = a.length, temp = 1;
if (length == 0) return new int[0];
int[] res = new int[length];
res[0] = 1;
for (int i = 1; i < length; i++)
res[i] = res[i - 1] * a[i - 1];
for (int j = length - 2; j >= 0; j--){
temp *= a[j + 1];
res[j] *= temp;
}
return res;
}