声网电话面试的总结,技术面, 声网20min(c/c++算法工程化类职位) (一面通过&拿到实习offer)

刚结束的电话面试. 声网.

面试结果:一面通过

听声音是一个经验丰富的大叔 . 比较认真且标准的技术人员的感觉 . (除了问实习时间外没有问别的多余的东西)

本人是acm铜牌选手,但是在本次面试数据结构和算法上连连翻车.哎~~~几近崩溃

主要是翻车的题.

没有自我介绍.

没有问语法问题

问了一些实习时间上的问题。

都是算法/数据结构/感觉高大上的问题.

"你经历还挺丰富啊,libco和redis的"(面试官说libco的发音跟自己的不太一样,没反应过来.)

这里说一下 : 学的这些内容Linux小组那边可能很常见 . 而且redis实在是谈不上已经掌握了. 从这里以及整体经历可以看出一点点面试官的态度:可能对应届生期望并不是那么高?可能面试官也不是职业面试官而是搞技术的主管,而且全程没问redis,说明这个岗位其实跟redis不太相关,也许面试官对redis和libco不太熟悉?

-2.8086汇编保护模式和实模式?(不太了解)

好吧,当时对这两个名词不太了解,其实实模式就是段地址+偏移地址(也就是直接使用物理地址)

保护模式就是现在用的虚拟地址那一套方法和理论.

-1.了解c++11的特性

答:只了解一些基本的(打比赛很少用到).

0.如何一层一层地遍历一棵树,

我答BFS.

问:具体怎么实现

使用队列,然后说了一下过程.还可以.

1.编译原理学过没(下学期开),数据结构呢?(当然学了)堆排序的排序过程.让我非常详细地说出步骤

2.堆排序和快排的区别(一时没想起来)

堆排序最坏复杂度nlogn , 快排 n*n

最排序空间复杂度(辅助空间),堆排序O(1),快排O(logn~n)

但是快排可以在大多数计算机体系上比较高效地完成.所以平均来说是最快的.

堆排序使用二叉树,快排本质是分治思想.

还有别的区别吗,有人知道请在下面留言谢谢.

3.看过Linux源码没?(QAQ)

答:没有

问:感不感兴趣?

答:非常感兴趣

问:那为什么不看呢?

答:时间紧迫,还没来得及看.

5.既然你看过libco,介绍一下libco,libco与线程的区别是什么

我说引入协程的目的跟引入线程的目的是一样的.协程的share_stack机制可以节约栈空间,协程上下文切换更快.

协程不能有效利用多核cpu的优势,需要用多进程和多线程来弥补.

(面试官似乎不太满意)然后又问;,libco比异步IO epoll要优于哪里?

我答:libco协程可以对一个作业从头到尾一条龙服务,但是epoll只能拆开. 主要是模型上的区别,其他的就不了解了.

6.快速排序与冒泡排序的复杂度?

快排nlogn,冒泡n*n,

快排比冒泡明显减掉了很多不必要的比较,举个栗子?

答不上来

7.链表怎么判环?

答:我大概把链表看成一棵树或者图.用搜索,把搜过的标记1,如果重复了就是环.

(明显不是面试管想要的答案,所以面试官补充:)

问:如果不允许修改链表数据结构,也就是不允许在上面打标记呢?

我:使用unordered_map,也就是hash来强行加标记,hash复杂度也是O(1).中间还跟面试官扯了一下红黑树版的map和hash版的map

面试官:哈希的话,几百万的数据也是有很多碰撞的吧?复杂度就不是O(1)了?咋办?

我...

好吧,其实当时听上去一百万挺大的.其实只有1e6也就是1M而已.hash明显可以做到近似O(1). 不过给我问蒙了(还是不够镇定啊,全程紧张),然后GG.

网上找了一下正解 , 据说是两个指针一快一慢地扫描链表 , 如果有环的话最终会在环上相遇 . (不是太懂为什么分叉处一定会进入环,如果没有进入环的话岂不是GG?)

https://www.cnblogs.com/dancingrain/p/3405197.html

后来想了想,这个题可能是我想复杂了(哎),面试一定要问清题意啊

然后面试官基本结束了电话面试,然后我赶紧问面试官能不能提一个问题.

end. 问题提完之后,又加了一个问题:我看到你对TCP有过一定了解.TCP发送数据时,使用阻塞的形式发送(send),接收端使用(recv),缓冲空间是2k,如果用send发送500字节的数据,每次send和recv的返回值是多少?(悲剧啊)

回答:只是用过但是没有了解过具体实现.这个问题不清楚.maybe跟窗口大小有关.

答案应该是500字节.缓冲足够的情况下,主要系统可以将数据拷贝到缓冲区中,就可以正确返回相应的大小.跟接收端是否接收到无关.https://blog.csdn.net/ordeder/article/details/17240221

 

总结一下

总体来讲,整个过程非常紧张,时间也很紧凑.一上来就开始提问.而且算法题只有半分钟到一分钟的思考时间,非常非常紧凑!!!

注重基础(我这破项目经历都能说成经历丰富,醉了),所以对与各种知识点都要吃透.比如我认为冷门的:快排节约了那些比较啊etc.

还有就是一定镇定!镇定!镇定! (但是时间这么紧凑怎么镇定啊)那种哈希的问题可能面试官也有点迷糊,其实冷静下来想一下这个题可以答得不错的.哎,一紧张就悲剧了.

这次面试基本围绕着简历上的内容.写了什么问什么.然后一定要搞扎实,把专业名词的含义搞明白!!!

面试的算法明显偏离acm算法,而是偏向于通用的面试算法.所以对各种排序/基础数据结构的  原理/实现/为什么/节约在哪里了  要有更深入/很深入的理解和掌握.!!!!

面试不是打比赛,面试不是打比赛,面试不是打比赛!!!允许思考的时间非常少。

还有最后提的问题大概是贵公司这个岗位需要什么样的知识储备啊,侧重什么呀这种的. 可不可以对我本次面试提一点建议啊?

回答  :  我们的岗位需要的知识你们在学校根本学不到.所以这次面试问的是那种普遍的问题.基础的问题,大面上的.

The End.

嗯,才面了第一个,所以上述观点一定不是很全面,大家参考一下就好.

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
以下是网络服务能力测试工具对应模块的实现方法和技术手段的C/C++代码示例: 1. 测试数据生成模块 测试数据生成模块可以使用随机数生成算法、数据模板生成算法等,以下是使用随机数生成算法的示例代码: ```c++ #include <cstdlib> #include <ctime> // 生成随机数 int rand_int(int min, int max) { static bool initialized = false; if (!initialized) { srand(time(NULL)); initialized = true; } return rand() % (max - min + 1) + min; } ``` 2. 测试执行控制模块 测试执行控制模块可以使用多线程技术、事件驱动技术等,以下是使用多线程技术的示例代码: ```c++ #include <thread> #include <vector> void test_worker(int thread_id) { // 执行测试任务 } // 启动并发测试 void start_concurrent_test(int thread_count) { std::vector<std::thread> threads; for (int i = 0; i < thread_count; i++) { threads.push_back(std::thread(test_worker, i)); } for (auto& t : threads) { t.join(); } } ``` 3. 测试结果收集模块 测试结果收集模块可以使用性能指标计算算法、性能指标统计算法等,以下是使用性能指标计算算法的示例代码: ```c++ #include <chrono> // 计算响应时间 long long calc_response_time(std::chrono::system_clock::time_point start_time, std::chrono::system_clock::time_point end_time) { std::chrono::duration<long long, std::micro> diff = end_time - start_time; return diff.count(); } ``` 4. 测试结果分析模块 测试结果分析模块可以使用数据分析算法、统计分析算法等,以下是使用统计分析算法的示例代码: ```c++ #include <algorithm> #include <vector> // 计算最大值 template<typename T> T calc_max(const std::vector<T>& data) { return *std::max_element(data.begin(), data.end()); } // 计算平均值 template<typename T> T calc_mean(const std::vector<T>& data) { T sum = std::accumulate(data.begin(), data.end(), 0); return sum / data.size(); } ``` 5. 网络通信模块 网络通信模块可以使用Socket编程接口、第三方网络库等,以下是使用Socket编程接口的示例代码: ```c++ #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> // 建立TCP连接 int tcp_connect(const char* ip, int port) { int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { return -1; } struct sockaddr_in serv_addr; memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(ip); serv_addr.sin_port = htons(port); if (connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) { return -1; } return sockfd; } ``` 6. 界交互模块 界交互模块可以使用命令行界、图形界等,以下是使用命令行界的示例代码: ```c++ #include <iostream> // 输出测试结果 void output_test_result(const std::string& result) { std::cout << result << std::endl; } // 获取测试参数 void get_test_params(int& thread_count, int& test_duration) { std::cout << "请输入线程数:"; std::cin >> thread_count; std::cout << "请输入测试时间(秒):"; std::cin >> test_duration; } ``` 7. 其他组成部分 其他组成部分包括日志记录模块、配置文件管理模块、异常处理模块等,以下是日志记录模块的示例代码: ```c++ #include <fstream> #include <chrono> // 记录日志 void write_log(const std::string& message) { std::ofstream log_file("log.txt", std::ios::app); if (log_file.is_open()) { auto now = std::chrono::system_clock::now(); std::time_t now_time = std::chrono::system_clock::to_time_t(now); log_file << std::ctime(&now_time) << message << std::endl; log_file.close(); } } ``` 总之,在C/C++中实现网络服务能力测试工具的对应模块可以使用多种技术手段和算法,包括随机数生成算法、多线程技术、事件驱动技术、性能指标计算算法、数据分析算法、Socket编程接口等。通过合理选择和应用这些技术算法,可以实现高效、准确的网络服务能力测试工具。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值