题目描述:
解法1:
定义一个足够大的整型数组来存放数字出现的次数,遍历整型数组,把数组的每个数字变为字符,通过ascii码的方式找到对应位置存储。当有相同的数出现时,出现的次数加1。最后直接返回返回目标元素出现的元素即可。
class Solution {
public int search(int[] nums, int target) {
int[] count = new int[100000];
for(int num : nums){
count[(char)num]++;
}
return count[(char)target];
}
}
解法2:
定义一个total变量用来记录目标元素出现的次数,然后直接遍历整型数组,判断每一个元素,当发现数组元素有和目标元素相同时,total加1。数组遍历完后返回total即可。
class Solution {
public int search(int[] nums, int target) {
int total = 0;
for(int i = 0; i < nums.length; i++){
if(nums[i] == target){
total++;
}
}
return total;
}
}
解法3:
这个是一位大佬写的解法。通过二分查找法查找目标元素的左边界和右边界,然后通过右边界减去左边界减1,就能得到目标元素出现的次数。
class Solution {
public int search(int[] nums, int target) {
// 搜索右边界 right
int i = 0, j = nums.length - 1;
while(i <= j) {
int m = (i + j) / 2;
if(nums[m] <= target) i = m + 1;
else j = m - 1;
}
int right = i;
// 若数组中无 target ,则提前返回
if(j >= 0 && nums[j] != target) return 0;
// 搜索左边界 right
i = 0; j = nums.length - 1;
while(i <= j) {
int m = (i + j) / 2;
if(nums[m] < target) i = m + 1;
else j = m - 1;
}
int left = j;
return right - left - 1;
}
}