Part 1
Q:C++实现二分查找
A:二分查找(Binary Search)是一种在有序数组中查找某一特定元素的搜索算法。其基本思想是将数组分成两部分,判断目标元素在哪一部分,然后递归地在该部分中查找,直到找到目标元素或者确定目标元素不存在为止。
以下是C++实现二分查找的示例代码:
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
using namespace std;
int binarySearch(int arr[], int left, int right, int target) {
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
int main() {
int arr[] = {1, 3, 5, 7, 9};
int n = sizeof(arr) / sizeof(arr[0]);
int target = 5;
int index = binarySearch(arr, 0, n - 1, target);
if (index != -1) {
cout << "Target found at index " << index << endl;
} else {
cout << "Target not found" << endl;
}
return 0;
}在上述代码中,
binarySearch函数接收一个有序数组arr、数组左端点left、数组右端点right和目标元素target作为参数。函数使用while循环进行二分查找,如果找到目标元素,则返回其下标;否则返回-1表示未找到。在
main函数中,我们定义了一个有序数组arr,并调用binarySearch函数查找目标元素5。如果找到目标元素,则输出其下标;否则输出未找到的提示信息。Q:是否会溢出呢
A:在上述代码中,二分查找的实现并不会导致溢出。这是因为在计算中间位置时,我们使用了以下代码:
1
int mid = left + (right - left) / 2;
Q:用泛型实现一下
A:(以下只贴代码)
1
2
3
4
5
6
7
8
9
10
11
12
13
14template <typename T>
int binarySearch(T arr[], int left, int right, T target) {
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}Q:能否使用迭代器
A:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16template <typename Iterator, typename T>
Iterator binarySearch(Iterator begin, Iterator end, T target) {
Iterator left = begin;
Iterator right = end - 1;
while (left <= right) {
Iterator mid = left + (right - left) / 2;
if (*mid == target) {
return mid;
} else if (*mid < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return end;
}Q:怎么限制这个函数只接收随机迭代器
A:
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
using namespace std;
template <typename Iterator, typename T>
typename std::enable_if<std::is_same<typename std::iterator_traits<Iterator>::iterator_category, std::random_access_iterator_tag>::value, Iterator>::type
binarySearch(Iterator begin, Iterator end, T target) {
Iterator left = begin;
Iterator right = end - 1;
while (left <= right) {
Iterator mid = left + (right - left) / 2;
if (*mid == target) {
return mid;
} else if (*mid < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return end;
}
int main() {
vector<int> vec = {1, 3, 5, 7, 9};
auto iter = binarySearch(vec.begin(), vec.end(), 5);
if (iter != vec.end()) {
cout << "Target found at index " << iter - vec.begin() << endl;
} else {
cout << "Target not found" << endl;
}
// This will not compile
// list<int> lst = {1, 3, 5, 7, 9};
// auto iter2 = binarySearch(lst.begin(), lst.end(), 5);
return 0;
}
Part 2
Q:查看linux上tcp连接数最多的上游ip
A:
1 | netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head |
Me:
1 | netstat -an | grep ESTABLISHED | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -n | tail |
Part 3
Q:解释一下这段代码
1 | int day_of_the_week(int y, int m, int d) { |
A:这段代码实现了一个函数day_of_the_week,用于计算给定日期是星期几。函数接受三个参数,分别是年份y、月份m和日期d。函数返回值是一个整数,表示星期几,其中0表示星期日,1表示星期一,以此类推。
函数的实现比较简洁,下面是对代码的解释:
- y -= m < 3:如果月份m小于3,说明当前日期是前一年的,因此将年份y减1。
- “-bed=pen+mad.”[m]:这是一个字符串字面量,其中每个字符都对应一个月份。例如,”-bed=pen+mad.”[1]表示字符’b’,对应的是二月份。因此,这个表达式的值就是当前月份的字符。
- (y + y / 4 - y / 100 + y / 400 + “-bed=pen+mad.”[m] + d) % 7:这是一个基于Zeller公式的计算式,用于计算给定日期是星期几。其中,y表示年份,d表示日期,”-bed=pen+mad.”[m]表示当前月份的字符。y / 4 - y / 100 + y / 400这一部分是用于计算闰年的,如果当前年份是闰年,则加1。最后,将这些值相加,并对7取模,得到的结果就是星期几的编号。
需要注意的是,这个函数只适用于公元1582年10月15日之后的日期。在此之前,历法的计算方式不同,因此需要使用其他的算法来计算星期几。