タイトル説明
回数にソート配列に表示される数をカウントします。図3は、アレイ内の4回、出力4を発生するため、例えば、入力配列は、{1,2,3,3,3,3,4,5}ソート、及び数3です。
アイデア解析
最初のk個の位置を見つけるために二分探索法を用いて、最後のkが表示され、数kの統計は、K中間サイズの中間の値と比較発生する可能性があります。
- kが半ば未満の場合、最初のkは、前半部分に表示されます。
- kが半ばよりも大きい場合、その後、最初のkが、後半に表示されます。
- それらが等しい場合は、kは、中間値または前回値K場合、kは最初の前半部に表示される最初の中間値か否かを判定する。
テストケース
- 機能テスト:配列を検索したい数字が含まれている、数字の配列を見つけることを望んでいない。digital'reを探しては、アレイに一回/複数回表示されます。
- 境界値試験:配列の最大値を検索し、最小値、アレイ内の唯一の数。
- 特別な入力テスト:ポインタのアレイはnullptrポインタが表されています。
Javaコード
public class Offer053_01 {
public static void main(String[] args) {
test1();
test2();
test3();
}
public static int GetNumberOfK(int[] array, int k) {
return Solution1(array, k);
}
private static int Solution1(int[] array, int k) {
if (array == null || array.length <= 0) {
return 0;
}
int firstK = getFirstK(array, 0, array.length - 1, k);
if (firstK == -1) {
return 0;
}
int lastK = getLastK(array, 0, array.length - 1, k);
return lastK - firstK + 1;
}
private static int getFirstK(int[] array,int start,int end,int k) {
if(start>end) {
return -1;
}
int mid = (start+end)>>1;
if(array[mid]==k) {
if(mid==0 || array[mid-1]!=k) {
return mid;
}else {
end = mid-1;
}
}else if(array[mid]<k) {
start = mid+1;
}else {
end = mid-1;
}
return getFirstK(array, start, end, k);
}
private static int getLastK(int[] array,int start,int end,int k) {
if(start>end) {
return -1;
}
int mid = (start+end)>>1;
if(array[mid]==k) {
if(mid==array.length-1 || array[mid+1]!=k) {
return mid;
}else {
start = mid+1;
}
}else if(array[mid]<k) {
start = mid+1;
}else {
end = mid-1;
}
return getLastK(array, start, end, k);
}
private static void test1() {
}
private static void test2() {
}
private static void test3() {
}
}