题目:
统计一个数字在排序数组中出现的次数。
思路:
在排序数组中先找到这个数字k,再查看它是否是第一个k,若是统计后边的k,若否向前统计并加上后边统计的。
Java
package nowcoder;
public class S37_GetNumberOfK {
public int GetNumberOfK(int[] array, int k){
int position = getPosition(array, k, 0, array.length-1);
System.out.println(position);
if (position == -1)
return 0;
//sum记录k的数量
int sum=0;
for (int i=position;i<array.length;i++){
if (array[i] == k)
sum++;
else break;
}
return sum;
}
//找到第一个k的位置
public int getPosition(int[] array, int k, int start, int end){
if (start > end)
return -1;
int mid = (start + end) >> 1;
if (array[mid] > k)
return getPosition(array, k, start, mid-1);
else if (array[mid] < k)
return getPosition(array, k, mid+1, end);
//若mid前的数值也等于k
else if (mid-1 >= 0 && array[mid-1] == k)
return getPosition(array, k, start, mid-1);
else return mid;
}
public static void main(String[] args){
S37_GetNumberOfK s37 = new S37_GetNumberOfK();
int[] array = {1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8};
System.out.println(s37.GetNumberOfK(array, 5));
}
}
Python
class GetNumberOfK:
def GetNumberOfK(self, array, k):
first = self.getFirstK(array, k, 0, len(array)-1)
last = self.getLastK(array, k, 0, len(array)-1)
return last - first+1
#递归找第一个k
def getFirstK(self, array, k, start, end):
if start>end:
return -1;
mid = (start + end) >> 1
if array[mid] > k:
return self.getFirstK(array, k, start, mid-1)
elif array[mid] < k:
return self.getFirstK(array, k, mid+1, end)
elif array[mid-1] == k and mid-1>=0:
return self.getFirstK(array, k, start, mid-1)
else:
return mid
#循环找最后一个k
def getLastK(self, array, k, start, end):
while start <= end:
mid = (start + end) >> 1
if array[mid] == k and array[mid+1] != k or mid == len(array)-1:
return mid
else:
if array[mid] > k:
end -= mid
else:
start += mid
return -2
if __name__ == '__main__':
test = GetNumberOfK()
array = [1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8]
print(test.GetNumberOfK(array, 5))