forked from Wang-Jun-Chao/coding-interviews
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTest38.java
More file actions
133 lines (113 loc) · 3.6 KB
/
Test38.java
File metadata and controls
133 lines (113 loc) · 3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/**
* Author: 王俊超
* Date: 2015-06-13
* Time: 14:24
* Declaration: All Rights Reserved !!!
*/
public class Test38 {
/**
* 找排序数组中k第一次出现的位置
*
* @param data
* @param k
* @param start
* @param end
* @return
*/
private static int getFirstK(int[] data, int k, int start, int end) {
if (data == null || data.length < 1 || start > end) {
return -1;
}
int midIdx = start + (end - start) / 2;
int midData = data[midIdx];
if (midData == k) {
if (midIdx > 0 && data[midIdx - 1] != k || midIdx == 0) {
return midIdx;
} else {
end = midIdx - 1;
}
} else if (midData > k) {
end = midIdx - 1;
} else {
start = midIdx + 1;
}
return getFirstK(data, k, start, end);
}
/**
* 找排序数组中k最后一次出现的位置
*
* @param data
* @param k
* @param start
* @param end
* @return
*/
private static int getLastK(int[] data, int k, int start, int end) {
if (data == null || data.length < 1 || start > end) {
return -1;
}
int midIdx = start + (end - start) / 2;
int midData = data[midIdx];
if (midData == k) {
if (midIdx + 1 < data.length && data[midIdx + 1] != k || midIdx == data.length - 1) {
return midIdx;
} else {
start = midIdx + 1;
}
} else if (midData < k) {
start = midIdx + 1;
} else {
end = midIdx - 1;
}
return getLastK(data, k, start, end);
}
/**
* 题目:统计一个数字:在排序数组中出现的次数
* @param data
* @param k
* @return
*/
public static int getNumberOfK(int[] data, int k) {
int number = 0;
if (data != null && data.length > 0) {
int first = getFirstK(data, k, 0, data.length - 1);
int last = getLastK(data, k, 0, data.length - 1);
if (first > -1 && last > -1) {
number = last - first + 1;
}
}
return number;
}
public static void main(String[] args) {
// 查找的数字出现在数组的中间
int[] data1 = {1, 2, 3, 3, 3, 3, 4, 5};
System.out.println(getNumberOfK(data1, 3)); // 4
// 查找的数组出现在数组的开头
int[] data2 = {3, 3, 3, 3, 4, 5};
System.out.println(getNumberOfK(data2, 3)); // 4
// 查找的数组出现在数组的结尾
int[] data3 = {1, 2, 3, 3, 3, 3};
System.out.println(getNumberOfK(data3, 3)); // 4
// 查找的数字不存在
int[] data4 = {1, 3, 3, 3, 3, 4, 5};
System.out.println(getNumberOfK(data4, 2)); // 0
// 查找的数字比第一个数字还小,不存在
int[] data5 = {1, 3, 3, 3, 3, 4, 5};
System.out.println(getNumberOfK(data5, 0)); // 0
// 查找的数字比最后一个数字还大,不存在
int[] data6 = {1, 3, 3, 3, 3, 4, 5};
System.out.println(getNumberOfK(data6, 0)); // 0
// 数组中的数字从头到尾都是查找的数字
int[] data7 = {3, 3, 3, 3};
System.out.println(getNumberOfK(data7, 3)); // 4
// 数组中的数字从头到尾只有一个重复的数字,不是查找的数字
int[] data8 = {3, 3, 3, 3};
System.out.println(getNumberOfK(data8, 4)); // 0
// 数组中只有一个数字,是查找的数字
int[] data9 = {3};
System.out.println(getNumberOfK(data9, 3)); // 1
// 数组中只有一个数字,不是查找的数字
int[] data10 = {3};
System.out.println(getNumberOfK(data10, 4)); // 0
}
}