1- function GetNumberOfK ( data , k ) {
2- // write code here
3- // 分两次二分查找,知道重复元素首次和最后一次出现位置,相减就能拿到重复次数了.
4-
5- // 左侧二分查找,重复元素第一次出现的索引位置
6- const left = leftBinarySearch ( data , k ) ;
7-
8- // 右侧二分查找,重复元素最后一次出现的索引位置
9- const right = rightBinarySearch ( data , k ) ;
10-
11- console . log ( `left:${ left } ----> right:${ right } ` )
12- return left === - 1 && right === - 1 ? 0 : right - left + 1
1+ /**
2+ * 获取指定位置的数
3+ * @param data
4+ * @param k
5+ */
6+ function GetNumberOfK ( data , k ) {
7+ // 分两次二分查找,知道重复元素首次和最后一次出现位置,相减就能拿到重复次数了.
8+
9+ // 左侧二分查找,重复元素第一次出现的索引位置
10+ const left = leftBinarySearch ( data , k )
11+
12+ // 右侧二分查找,重复元素最后一次出现的索引位置
13+ const right = rightBinarySearch ( data , k )
14+
15+ console . log ( `left:${ left } ----> right:${ right } ` )
16+ return left === - 1 && right === - 1 ? 0 : right - left + 1
1317}
1418
15- function rightBinarySearch ( data , target ) {
16- if ( ! data . length ) {
17- return - 1
18- }
19- let left = 0 ;
20- let right = data . length - 1 ;
21-
22- while ( left <= right ) {
23-
24- let mid = left + Math . floor ( ( right - left ) / 2 ) ;
25-
26- if ( target === data [ mid ] ) {
27- left = mid + 1
28- } else if ( target < data [ mid ] ) {
29- // 左侧
30- right = mid - 1
31- } else if ( target > data [ mid ] ) {
32- // 右侧;
33- left = mid + 1 ;
34- }
35- }
36- // left = right+1; 判断出界
37- if ( right < 0 || data [ right ] !== target ) {
38- return - 1
19+ function rightBinarySearch ( data , target ) {
20+ if ( ! data . length ) {
21+ return - 1
22+ }
23+ let left = 0
24+ let right = data . length - 1
25+
26+ while ( left <= right ) {
27+ const mid = left + Math . floor ( ( right - left ) / 2 )
28+
29+ if ( target === data [ mid ] ) {
30+ left = mid + 1
31+ } else if ( target < data [ mid ] ) {
32+ // 左侧
33+ right = mid - 1
34+ } else if ( target > data [ mid ] ) {
35+ // 右侧;
36+ left = mid + 1
3937 }
40- return right
38+ }
39+ // left = right+1; 判断出界
40+ if ( right < 0 || data [ right ] !== target ) {
41+ return - 1
42+ }
43+ return right
4144}
4245
43-
4446// [left,right]
45- function leftBinarySearch ( data , target ) {
46- if ( ! data . length ) {
47- return - 1
47+ function leftBinarySearch ( data , target ) {
48+ if ( ! data . length ) {
49+ return - 1
50+ }
51+ let left = 0
52+ let right = data . length - 1
53+
54+ while ( left <= right ) {
55+ const mid = left + Math . floor ( ( right - left ) / 2 )
56+
57+ if ( target === data [ mid ] ) {
58+ // 左侧收缩
59+ right = mid - 1
60+ } else if ( target < data [ mid ] ) {
61+ // 左侧
62+ right = mid - 1
63+ } else if ( target > data [ mid ] ) {
64+ // 右侧;
65+ left = mid + 1
4866 }
49- let left = 0 ;
50- let right = data . length - 1 ;
51-
52- while ( left <= right ) {
67+ }
5368
54- let mid = left + Math . floor ( ( right - left ) / 2 ) ;
69+ // left = right+1; 判断出界
70+ if ( left > data . length || data [ left ] !== target ) {
71+ return - 1
72+ }
5573
56- if ( target === data [ mid ] ) {
57- // 左侧收缩
58- right = mid - 1 ;
59- } else if ( target < data [ mid ] ) {
60- // 左侧
61- right = mid - 1
62- } else if ( target > data [ mid ] ) {
63- // 右侧;
64- left = mid + 1 ;
65- }
66- }
67-
68-
69- // left = right+1; 判断出界
70- if ( left > data . length || data [ left ] !== target ) {
71- return - 1
72- }
73-
74-
75- return left
74+ return left
7675}
7776
78-
7977console . log ( GetNumberOfK ( [ 1 , 2 , 3 , 3 , 3 , 3 , 4 , 5 ] , 3 ) )
8078console . log ( GetNumberOfK ( [ 3 , 3 , 3 , 3 , 4 , 5 ] , 3 ) )
8179console . log ( GetNumberOfK ( [ 1 , 2 , 3 , 3 , 3 , 3 ] , 3 ) )
@@ -87,8 +85,3 @@ console.log(GetNumberOfK([3, 3, 3, 3], 4))
8785console . log ( GetNumberOfK ( [ 3 ] , 3 ) )
8886console . log ( GetNumberOfK ( [ 3 ] , 4 ) )
8987console . log ( GetNumberOfK ( [ 1 , 3 , 3 , 3 , 3 , 4 , 5 ] , 2 ) )
90-
91-
92- module . exports = {
93- GetNumberOfK : GetNumberOfK
94- } ;
0 commit comments